首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何在Java中用avro模式的UNION类型验证记录值

在Java中使用Avro模式的UNION类型验证记录值的步骤如下:

  1. 首先,确保已经安装了Avro库。可以通过在项目的依赖管理文件(如Maven的pom.xml)中添加Avro依赖来实现。例如:
代码语言:txt
复制
<dependency>
    <groupId>org.apache.avro</groupId>
    <artifactId>avro</artifactId>
    <version>1.10.2</version>
</dependency>
  1. 创建Avro模式文件。Avro使用模式文件来定义数据结构。在模式文件中,可以定义UNION类型以及其包含的各种类型。例如,创建一个名为example.avsc的Avro模式文件,其中包含一个UNION类型:
代码语言:txt
复制
{
  "type": "record",
  "name": "ExampleRecord",
  "fields": [
    {
      "name": "value",
      "type": [
        "null",
        "string",
        "int"
      ]
    }
  ]
}

在上述示例中,value字段的类型是一个UNION类型,包含了nullstringint三种类型。

  1. 使用Avro工具生成Java类。Avro提供了一个命令行工具avro-tools,可以使用它来生成Java类。执行以下命令来生成Java类:
代码语言:txt
复制
java -jar avro-tools-1.10.2.jar compile schema example.avsc .

这将生成一个名为ExampleRecord.java的Java类,该类对应于Avro模式文件中定义的记录类型。

  1. 在Java代码中使用Avro验证记录值。使用生成的Java类,可以在Java代码中创建Avro记录对象,并使用Avro模式文件中定义的UNION类型验证记录值。例如:
代码语言:txt
复制
import org.apache.avro.Schema;
import org.apache.avro.generic.GenericData;
import org.apache.avro.generic.GenericRecord;
import org.apache.avro.io.DatumWriter;
import org.apache.avro.io.Encoder;
import org.apache.avro.io.EncoderFactory;
import org.apache.avro.specific.SpecificDatumWriter;

import java.io.ByteArrayOutputStream;
import java.io.IOException;

public class AvroExample {
    public static void main(String[] args) throws IOException {
        // 加载Avro模式文件
        Schema schema = new Schema.Parser().parse(AvroExample.class.getResourceAsStream("example.avsc"));

        // 创建Avro记录对象
        GenericRecord record = new GenericData.Record(schema);
        record.put("value", "Hello, Avro!");

        // 验证记录值
        validateRecordValue(record);
    }

    private static void validateRecordValue(GenericRecord record) throws IOException {
        // 创建Avro编码器
        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
        Encoder encoder = EncoderFactory.get().binaryEncoder(outputStream, null);

        // 创建Avro模式的UNION类型的验证器
        Schema.Field field = record.getSchema().getField("value");
        Schema unionSchema = field.schema();
        DatumWriter<Object> writer = new SpecificDatumWriter<>(unionSchema);

        // 将记录值编码为字节数组
        writer.write(record.get("value"), encoder);
        encoder.flush();

        // 获取编码后的字节数组
        byte[] encodedBytes = outputStream.toByteArray();

        // 打印编码后的字节数组
        System.out.println("Encoded bytes: " + encodedBytes);
    }
}

在上述示例中,首先加载Avro模式文件,然后创建一个Avro记录对象,并将值设置为"Hello, Avro!"。接下来,通过validateRecordValue()方法验证记录值。该方法使用Avro编码器和UNION类型的验证器将记录值编码为字节数组,并打印编码后的字节数组。

请注意,上述示例仅演示了如何使用Avro模式的UNION类型验证记录值,并没有涉及到具体的云计算相关内容。如果需要在云计算环境中使用Avro,可以结合具体的云计算平台和服务进行开发和部署。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

基于Java实现Avro文件读写功能

读取 Avro 数据时,写入时使用模式始终存在。 这允许在没有每个开销情况下写入每个数据,从而使序列化既快速又小。 这也便于使用动态脚本语言,因为数据及其模式是完全自描述。...由于客户端和服务器都具有对方完整模式,因此可以轻松解决相同命名字段之间对应关系,缺少字段,额外字段等 . Avro 模式是用 JSON 定义。 这有助于在已经具有 JSON 库语言中实现。...模式由基本类型(null、boolean、int、long、float、double、bytes 和 string)和复杂类型(record、enum、array、map、union 和 fixed)组成...字段是通过对象数组定义,每个对象都定义了一个名称和类型(其他属性是可选,有关详细信息,请参阅记录规范)。 字段类型属性是另一个模式对象,它可以是基本类型或复杂类型。...与构造函数不同,生成器将自动设置模式中指定任何默认。 此外,构建器会按设置验证数据,而直接构造对象在对象被序列化之前不会导致错误。

2.9K50

avro格式详解

【schema】 Avro依赖"schema"(模式)来实现数据结构定义,schema通过json对象来进行描述表示,具体表现为: 一个json字符串命名一个定义类型 一个json对象,其格式为`{...为用户提供该模式说明(可选) aliases:字符串json数组,为该记录提供备用名称 fields:一个json数组,罗列所有字段(必选),每个字段又都是一个json对象,并包含如下属性: name...:字段名称(必选) doc:字段描述(可选) type:一个schema,定义如上 default:字段默认 order:指定字段如何影响记录排序顺序,有效为`"ascending"`(默认...需要注意是:当为union类型字段指定默认时,默认类型必须与union第一个元素匹配,因此,对于包含"null"union,通常先列出"null",因为此类型union默认通常为空。...为该记录提供备用名称 doc:一个json字符串,为用户提供该模式说明(可选) size:一个整数,指定每个字节数(必须) 例如,16字节数可以声明为: { "type": "fixed

2.8K11
  • Avro、Protobuf和Thrift中模式演变

    相反,如果你想撇开一个,你可以使用一个联合类型,比如上面的union { null, long }。这被编码为一个字节,告诉解析器要使用哪种可能联合类型,然后是本身。...通过使用null类型Union(简单地编码为零字节),你可以让一个字段变得可有可无。 Union类型很强大,但在改变它们时,你必须小心。...如果你想给Union添加一个类型,你首先需要用新模式更新所有的读者,这样他们就知道该怎么做了。只有当所有的读者都被更新后,写作者才可以开始把这个新类型放在他们生成记录中。...然后,你可以更新写作者模式以使用新字段名。 你可以在一条记录中添加一个字段,只要你给它一个默认(例如,如果字段类型是与null联合,则为null)。...默认是必要,这样当使用新模式读者解析用旧模式记录时(因此缺少字段),它就可以填入默认来代替。 相反,你可以从一条记录中删除一个字段,只要它以前有一个默认

    1.2K40

    Apache Avro是什么干什么用(RPC序列化)

    这里,根据模式产生Avro对象类似于类实例对象。每次序列化/反序列化时都需要知道模式具体结构。所以,在Avro可用一些场景下,文件存储或是网络通信,都需要模式与数据同时存在。...对于基本类型和混合类型二进制编码在文档中规定,按照模式解析顺序依次排列字节。对于JSON编码,联合类型(Union Type)就与其它混合类型表现不一致。...对于文件中头信息之后每个数据块,有这样结构:一个long记录当前块有多少个对象,一个long用于记录当前块经过压缩后字节数,真正序列化对象和16字节长度同步标记符。...那Avro是如何应对模式与数据不同呢?为了保证Avro高效,假定模式至少大部分是匹配,然后定义一些验证规则,如果在规则满足前提下,做数据验证。如果模式不匹配就会报错。...相同模式,交互数据时,如果数据中缺少某个域(field),用规范中默认设置;如果数据中多了些与模式不匹配数据。则忽视这些Avro列出优点中还有一项是:可排序

    3.1K40

    DDIA 读书分享 第四章:编码和演化

    Avro 编码逐字节解析 因此,Avro 必须配合模式定义来解析, Client-Server 在通信握手阶段会先交换数据模式。 写入模式和读取模式 没有字段标号,Avro 如何支持模式演进呢?...Avro 两种模式进行匹配 模式演化规则 那么如何保证写入模式兼容呢? 在增删字段时,只能添加或删除具有默认字段。 在更改字段类型时,需要 Avro 支持相应类型转换。...Avro 没有像 ProtoBuf、Thrift 那样 optional 和 required 限定符,是通过 union 方式,来指定默认,甚至多种类型union {null, long,...更改字段名和在 union 中添加类型,都是向后兼容,但是不能向前兼容,想想为什么? 如何从编码中获取写入模式 对于一段给定 Avro 编码数据,Reader 如何从其中获得其对应写入模式?...这时 Avro 这种支持不生成代码框架就节省一些,它可以将模式写入数据文件,读取时利用 Avro 进行动态解析即可。 模式优点 模式本质是显式类型约束,即,先有模式,才能有数据。

    1.2K20

    Avro介绍

    组合类型默认是看组合类型第一个元素,因此如果一个组合类型包括null类型,那么null类型一般都会放在第一个位置,这样子的话这个组合类型默认就是null。...解析json文件时候,如果类型是Record并且里面有字段是union并且允许空的话,需要进行转换。...因为[“bytes”, “string”]和[“int”,”long”]这2个union类型在json中是有歧义,第一个union在json中都会被转换成string类型,第二个union在json中都会被转换成数字类型...所以如果jsonnull的话,在avro提供json中直接写null,否则使用只有一个键值对对象,键是类型具体。...先记录一下,以后遇到新坑会更新这篇文章。

    2.1K10

    《数据密集型应用系统设计》读书笔记(四)

    具体来说,当添加了一个带有默认字段,使用新模式 reader 读取旧模式写入记录时,将为缺少字段填充默认(向后兼容性);而使用旧模式 reader 读取新模式写入记录时,将直接忽略该字段...基于上述模式演化规则,与 Protocol Buffers 和 Thrift 不同,Avro 并没有可选(optional)与必需(required)标签,而是使用了「联合类型」(union type...1.4.5 代码生成与动态类型语言 Thrift 与 Protocol Buffers 都依赖于代码生成:定义模式之后,可以使用所选编程语言生成实现此模式代码,这种方式在「静态类型语言」(例如 Java...,此时由较新代码写入需要由仍在运行旧版本代码读取 对于前向兼容,基于数据库数据流存在一个额外障碍:如果在记录模式中添加了一个字段,新代码将该新字段写入数据库,此时如果旧代码需要读取、更新该记录...其强调简单数据格式,使用 URL 来标识资源,使用 HTTP 功能来进行缓存控制、身份验证和内容类型协商。根据 REST 原则所设计 API 被称为 「RESTful」。

    1.9K20

    什么是Avro?Hadoop首选串行化系统——Avro简介及详细使用

    另外,avro支持跨编程语言实现(C, C++, C#,Java, Python, Ruby, PHP),类似于Thrift,但是avro显著特征是:avro依赖于模式,动态加载相关数据模式Avro...Avro数据类型模式 Avro定义了少量基本数据类型,通过编写模式方式,它们可被用于构建应用特定数据结构。考虑到互操作性,实现必须支持所有的Avro类型。...Avro基本类型 类型 描述 模式示例 null 空 “null” boolean 二进制 “boolean” int 32位带符号整数 “int” long 64位带符号整数 “long” float...方法1 使用编译方式 这种方式是比较常见,即根据Avro模式生成JAVA代码,然后根据JAVA API来进行数据操作。...其中User.java里面生成User类及其内部类包名默认是user.avsc文件中namespace。 ?

    1.6K30

    《数据密集型应用系统设计》 - 数据编码和演化

    Avro为了保持兼容性,只提供了默认字段增删权限,比如新增带有默认字段,使用新模式reader读取会使用默认(如果读模式需要字段写模式没有提供会使用默认转化),使用旧模式write则会直接过滤...Avro 除了这两个模式特点之外,还有一种非常特殊情况,对于 null 内容处理,这和多数编程语言不同,如果 Avro 中声明 允许为null,必须要是联合类型。...联合类型就像是下面这样格式:union {null, long, string}和 ProtocolBuff 和 Thrift 都不太一样只有当null是联合分支时候才允许作为默认,此外它没有默认标签或者列表维护方式可选...网络连接发送记录,在建立连接时候建立模式建立版本,然后在生命周期当中完成工作,Avro RPC工作原理就是如此。...REST 概念是利用URL标识资源,通过HTTP协议本身完成缓存控制,身份验证和内容类型协商。不同是为资源定义更为明显标记和界限。REST原则所设计API称为RESTful Api。

    1.3K00

    编码与模式------《Designing Data-Intensive Applications》读书笔记5

    Avro编码格式 在Avro模式之中没有标记号。将同样数据进行编码,Avro二进制编码是32个字节长,是上述编码之中最紧凑。检查上述字节序列,并没有标识字段或数据类型。...编码简单地由连接在一起组成。在解析二进制数据时,通过使用模式来确定每个字段数据类型。这意味着如果读取数据代码与写入数据代码使用完全相同模式,二进制数据才能被正确地解码。...每个字段由标签号码和注释数据类型识别(字符串或整数)。如果没有设置字段,则只需从已编码记录中省略该字段。因此字段标记对编码数据含义至关重要。...每当数据库模式发生变化时,管理员必须手动更新从数据库列名到字段标记映射。而Avro是每次运行时简单地进行模式转换。任何读取新数据文件程序都会感知到记录字段发生了变化。...它们模式语言比XML模式或JSON模式要简单得多,它支持更详细验证规则,并且能够更好进行模式演化升级,在性能上也有了更好提升。

    1.4K40

    收藏!6道常见hadoop面试题及答案解析

    注意:序列文件是以Java为中心,不能跨平台使用。   Avro文件适合于有模式长期存储。Avro文件存储具有数据元数据,但也允许指定用于读取文件独立模式。...启用完全模式进化支持,允许你通过定义新独立模式重命名、添加和删除字段以及更改字段数据类型Avro文件以JSON格式定义模式,数据将采用二进制JSON格式。...Avro文件也是可拆分,并支持块压缩。更适合需要行级访问使用模式。这意味着查询该行中所有列。不适用于行有50+列,但使用模式只需要访问10个或更少列。...如果在向磁盘写入记录时已知所有列,则面向行写也是有效。但是这种方法不能有效地获取行中仅10%列或者在写入时所有列都不知道情况。这是Columnar文件更有意义地方。...所以Columnar格式在以下情况下工作良好   在不属于查询列上跳过I/O和解压缩   用于仅访问列一小部分查询。   用于数据仓库型应用程序,其中用户想要在大量记录上聚合某些列。

    2.6K80

    Hadoop重点难点:Hadoop IO压缩序列化

    ObjectWritable和GenericWritable ObjectWritable 是对 java 基本类型(String,enum,Writable,null或这些类型组成数组)一个通用封装...它在 Hadoop RPC 中用于对方法参数和返回类型进行封装和解封装。...ArrayPrimitiveWritable 是对 Java 基本数组类型一个封装。调用 set() 方法时,可以识别相应组件类型,因而无需通过继承该类来设置类型。...每个文件都有一个随机生成同步标识,其存储在文件头中,位于顺序文件中记录记录之间。同步标识额外存储开销要求小于1%,所以没有必要在每条记录末尾添加该标识。...顺序文件,map 文件和 Avro 数据文件都是面向行格式,意味着每一行在文件中是连续存储

    93910

    Hadoop重点难点:Hadoop IO压缩序列化

    ObjectWritable和GenericWritable ObjectWritable 是对 java 基本类型(String,enum,Writable,null或这些类型组成数组)一个通用封装...它在 Hadoop RPC 中用于对方法参数和返回类型进行封装和解封装。...ArrayPrimitiveWritable 是对 Java 基本数组类型一个封装。调用 set() 方法时,可以识别相应组件类型,因而无需通过继承该类来设置类型。...每个文件都有一个随机生成同步标识,其存储在文件头中,位于顺序文件中记录记录之间。同步标识额外存储开销要求小于1%,所以没有必要在每条记录末尾添加该标识。...顺序文件,map 文件和 Avro 数据文件都是面向行格式,意味着每一行在文件中是连续存储

    97930

    【大数据哔哔集20210111】HDFS中常用压缩算法及区别

    共通性, 文件格式是否支持多种语言, 服务读取。比如Hadoop主要序列化格式为Writables, 但是Writables只支持Java, 所以后面衍生出了Avro, Thrift等格式。...还OrcFile是对Hive设计一种列式存储格式, 但是他不支持Impala, 数据共用性受到了制约。...HDFS中文件类型 基于文件存储 序列化和列式存储,例如:Avro、RCFile和Parquet 压缩存储,例如Snappy、LZO等 下面我们依次来介绍。...每条Record以键值对方式进行存储,用来表示它字符数组可以一次解析成:记录长度、Key长度、Key和value,并且Value结构取决于该记录是否被压缩。...Avro模式存储在文件头中,所以每个文件都是自描述,而且Avro还支持模式演进(schema evolution),也就是说,读取文件模式不需要与写入文件模式严格匹配,当有新需求时,可以在模式中加入新字段

    1.1K10

    Kafka和Redis系统设计

    AVRO 内存和存储方面的限制要求我们从传统XML或JSON对象转向AVROAVRO被选为数据格式原因有很多: 紧凑格式。...第3阶段:验证 每行数据都通过适用验证规则传递。我们实现了模式DSL,使系统能够使用谓词逻辑定义验证规则。...数据验证过程取决于特定条件,实现模式具有验证规则和条件映射。 验证规则是根据数据类型动态构建,并应用于数据。并收集验证错误并将其发送到异常服务。...使用跨越多个JVM原子计数器记录数据验证成功或失败。 第四阶段:和解 系统职责是通知文件,切片和运行级别的风险运行处理完成情况。那么,我们如何才能实现这一目标呢?事件管理器组件负责此任务。...Redis中INCR操作是一个原子操作,它返回递增并确保不同进程不接管相同密钥。

    2.5K00

    用 Apache NiFi、Kafka和 Flink SQL 做股票智能分析

    如果你知道你数据,建立一个 Schema,与注册中心共享. 我们添加一项独特n内容是Avro Schema中默认,并将其设为时间戳毫秒逻辑类型。...ForkRecord:我们使用它从使用RecordPath语法标头 (/values) 中分离出记录。 QueryRecord:使用 SQL 转换类型和操作数据。...( ValidateRecord ):对于不太可靠数据源,我可能想根据我们模式验证数据,否则,我们将收到警告或错误。...PublishKafkaRecord_2_0: 从 JSON 转换为 AVRO,发送到我们 Kafka 主题,其中包含对正确模式股票引用及其版本1.0。...正如我们所看到,它是附加 Avro Schema,所以我们使用该 Reader 并使用该模式转换为简单 JSON。

    3.6K30

    03 Confluent_Kafka权威指南 第三章: Kafka 生产者:向kafka写消息

    Producer Overview 应用程序可能需要向kafka写入消息原因有很多,记录用于审计和分析用户活动、记录指标、存储日志消息、记录来自只能设备信息、与其他应用程序异步通信、在写入数据库之前进行缓冲等等...但是生产者运行使用任何参数类型将任何java对象做为key和value发送。这使得代码可读性更强。但是也意味着生产者必须指定如何将这些对象转换为字节数组。...Using Avro Records with Kafka Avro文件在数据文件中存储整个模式会造成适当开销,与之不同时,如果在每个记录中都存储模式文件的话,这样会造成每条记录大小增加一倍以上。...但是avro在读取记录时任然需要提供整个模式文件,因此我们需要在其他地方对模式文件进行定义。为了实现这一点,我们遵循一个通用体系结构,使用一个模式注册表。...将用于向kafka写入数据所有模式存储在注册表中,然后,我们只需要将模式标识符存储在生成给kafka记录中。然后,消费者可以使用标识符从模式注册表中提取记录并反序列化数据。

    2.8K30

    Schema Registry在Kafka中实践

    数据序列化格式 在我们知道Schema Registry如何在Kafka中起作用,那我们对于数据序列化格式应该如何进行选择?...在我们选择合适数据序列化格式时需要考虑点: 1、是否序列化格式为二进制 2、是否我们可以使用schemas来强制限制数据结构 AVRO简单介绍 AVRO是一个开源二进制数据序列化格式。...它提供了丰富数据结构,并在c#和Java等静态类型编程语言上提供了代码生成功能。...支持基本数据类型(比如int、boolean、string、float等)和复杂数据类型(enums、arrays、maps等) 使用JSON来定义AVRO schema 速度很快 我们可以给字段设置默认...,随着业务复杂变化,我们发送消息体也会由于业务变化或多或少变化(增加或者减少字段),Schema Registry对于schema每次变化都会有对应一个version来记录 当schema

    2.7K31
    领券