【问题标题】:Avro array using Apache Avro使用 Apache Avro 的 Avro 阵列
【发布时间】:2021-03-01 16:42:12
【问题描述】:

实际上我的问题类似于下面链接中显示的答案(显示使用 avsc javascript 库进行序列化/反序列化),但我需要一个解决方案来序列化到 avro 并使用 apache avro for java 反序列化它。 .

Avro schema for Json array

https://avro.apache.org/docs/current/gettingstartedjava.html

数据

[
 {"id":1,"text":"some text","user_id":1},
 {"id":1,"text":"some text","user_id":2},
 ...
]

架构

{
  "name": "Name",
  "type": "array",
  "namespace": "com.hi.avro.model",
  "items": {
    "name": "NameDetails",
    "type": "record",
    "fields": [
      {
        "name": "id",
        "type": "int"
      },
      {
        "name": "text",
        "type": "string"
      },
      {
        "name": "user_id",
        "type": "int"
      }
    ]
  }
}

感谢任何帮助...

【问题讨论】:

  • 你有没有尝试过?您链接到正是出于这个原因而存在的入门指南。

标签: java avro


【解决方案1】:

我已开始阅读 API,并在我的代码上试用...

创建帖子后,我努力将其分配给 GenericRecord,但它不起作用。所以我发布了这个问题,因为我不清楚。

最后,我没有将整个数组分配给 GenericRecord,而是继续使用 GenericArray 并将 GenericRecord 添加到其中

下面是sn-p的代码

//转json

GenericArray record = new GenericDatumReader<GenericArray>(schema).read(null, binaryDecoder);

ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
NoWrappingJsonEncoder jsonEncoder = new NoWrappingJsonEncoder(record.getSchema(), outputStream);
DatumWriter<GenericArray> writer = record instanceof SpecificRecord ?
            new SpecificDatumWriter<>(record.getSchema()) :
            new GenericDatumWriter<>(record.getSchema());
    writer.write(record, jsonEncoder);
    jsonEncoder.flush();
byte[] result = outputStream.toByteArray();
    
    
    

//到 avro

ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
BinaryEncoder encoder = EncoderFactory.get().binaryEncoder(outputStream, null);
GenericDatumWriter<Object> writer = new GenericDatumWriter(schema, genericData);
    
byte[] data;
    
List list = mapper.readValue(data, List.class);
    
GenericRecordBuilder record = new GenericRecordBuilder(schema.getElementType());
List<GenericData.Record> array = new ArrayList<>();

json.forEach(entry -> {
     //logic for reading GenericRecord for each of the list should be done here
     ...

     array.add(genericRecord);
});
    
writer.write(array, encoder);
     
encoder.flush();
     
byte[] result =  outputStream.toByteArray();

【讨论】:

    猜你喜欢
    • 2012-08-05
    • 2021-06-14
    • 1970-01-01
    • 1970-01-01
    • 2020-11-26
    • 2018-01-23
    • 2020-07-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多