java - 如何在 Java 中定义 Avro 联合

标签 java serialization avro

我定义了一个由记录组成的 Avro 模式,该记录包含两个(或更多)不同记录的联合,例如:

{
  "type":"record",
  "name":"MyCompositeRecord",
  "fields":
  [
    {"name":"SomeCommonData","type":"string"},
    {"name":"MoreCommonData","type":"float"},
    {"name":"CompositeRecord","type":
      [
        {
          "type":"record",
          "name":"FirstOption",
          "fields":
          [
            {"name":"x","type":"string"},
            {"name":"y","type":"long"}
          ]
        },
        {
          "type":"record",
          "name":"SecondOption",
          "fields":
          [
            {"name":"z","type":"int"},
            {"name":"w","type":"float"},
            {"name":"m","type":"double"},
            {"name":"l","type":"boolean"}
          ]
        }
      ]
    }
  ]
}

它看起来不是很清楚,但我希望你明白了:我有一个由一些数据(“SomeCommonData”和“MoreCommonData”)和两种不同类型的记录(“FirstOption”和“第二选项”)。在序列化/反序列化时,我应该能够创建两个子记录之一并序列化“MyCompositeRecord”。

我还没有尝试为模式生成代码,因为我打算只使用通用记录。但是,我不确定是否以及如何序列化此类通用记录。我在网上找不到任何例子。我将使用 java 进行序列化/反序列化。我能够为模式创建一个编写器/读取器,如下所示:

Schema.Parser parser = new Schema.Parser();
Schema schema = parser.parse(COMPOSITE_SCHEMA);
DatumWriter<GenericRecord> writer = new GenericDatumWriter<>(schema);
DatumReader<GenericRecord> reader = new GenericDatumReader<>(schema);
GenericRecord datum = new GenericData.Record(schema);

关于如何从这里开始实际建立记录的任何想法?

谢谢

最佳答案

基本上对于联合来说,它与设置任何其他字段没有什么不同:

GenericRecord datum = new GenericData.Record(schema);

datum.set(1, data);

其中 1 是联合字段编号,数据是要设置的值。

如果您查看 getDefaultValue AvroEditor - Helper ,您将看到我为每种 Avro 类型使用的默认值。数组必须实现 GenericArray

关于java - 如何在 Java 中定义 Avro 联合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15841965/

相关文章:

jquery - hack jQuery 序列化不在表单内的 &lt;input&gt; 和 <select> 元素的值

java - 直接自引用导致循环异常

java - 在不同文件中引用 avro 架构不起作用 - avro 会抛出错误

java - Hibernate - 软删除 - 多个参数

java - 如何使用 currentTimeMillis() 在类上运行计算速度?

c++ - 管道序列化

java - Avro Schema Evolution With GenericData.Record - Mapreduce 过程

java - 无法以 AVRO 格式从 Kafka Producer 发送 GenericRecord 数据

java - 关于 LL1 非递归解析器中的 AST 构造

java - 从文件中读取整数并将值存储到数组中