有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

使用apacheavro的javaavro阵列

实际上,我的问题与下面链接中给出的答案类似(其中显示了使用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"
      }
    ]
  }
}

谢谢你的帮助


共 (1) 个答案

  1. # 1 楼答案

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

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

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

    下面是代码片段

    //到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();
        
        
        
    

    //致阿夫罗

    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();