首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Apache Avro的Avro阵列

使用Apache Avro的Avro阵列
EN

Stack Overflow用户
提问于 2021-02-26 17:05:13
回答 1查看 423关注 0票数 0

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

Json数组的Avro架构

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

数据

代码语言:javascript
复制
[
 {"id":1,"text":"some text","user_id":1},
 {"id":1,"text":"some text","user_id":2},
 ...
]

模式

代码语言:javascript
复制
{
  "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"
      }
    ]
  }
}

感谢任何帮助..。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-03-01 16:42:12

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

当我创建了这篇文章时,我努力地将它分配给GenericRecord,但这是不起作用的。所以我发布了这个问题,因为我不清楚它。

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

下面是代码片段

//到json

代码语言:javascript
复制
GenericArray record = new GenericDatumReader(schema).read(null, binaryDecoder);

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

//到avro

代码语言:javascript
复制
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
BinaryEncoder encoder = EncoderFactory.get().binaryEncoder(outputStream, null);
GenericDatumWriter writer = new GenericDatumWriter(schema, genericData);
    
byte[] data;
    
List list = mapper.readValue(data, List.class);
    
GenericRecordBuilder record = new GenericRecordBuilder(schema.getElementType());
List 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();
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66382917

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档