【问题标题】:Produce Avro message from using classes使用类生成 Avro 消息
【发布时间】:2021-05-16 15:00:48
【问题描述】:

到目前为止,我正在从 avsc 架构文件创建 avro 消息。使用下面的代码 sn-p

static byte[] fromJasonToAvro(String json, String schemastr) throws Exception {

        InputStream input = new ByteArrayInputStream(json.getBytes());
        DataInputStream din = new DataInputStream(input);

        Schema schema = Schema.parse(schemastr);

        Decoder decoder = DecoderFactory.get().jsonDecoder(schema, din);

        DatumReader<Object> reader = new GenericDatumReader<Object>(schema);
        Object datum = reader.read(null, decoder);

        GenericDatumWriter<Object> w = new GenericDatumWriter<Object>(schema);
        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();

        Encoder e = EncoderFactory.get().binaryEncoder(outputStream, null);

        w.write(datum, e);
        e.flush();

        return outputStream.toByteArray();
    }


    public static void main(String[] args) throws Exception {

        StringBuilder sb = new StringBuilder();
        StringBuilder jsb = new StringBuilder();

        ClassLoader classloader = Thread.currentThread().getContextClassLoader();
        InputStream is = classloader.getResourceAsStream("RsvpAvroSchema.avsc");
        InputStream js = classloader.getResourceAsStream("JsonMessage.dat");
        
        InputStreamReader isr = new InputStreamReader(is, StandardCharsets.UTF_8);
        InputStreamReader jisr = new InputStreamReader(js, StandardCharsets.UTF_8);
        BufferedReader br = new BufferedReader(isr);
        BufferedReader jbr = new BufferedReader(jisr);
        br.lines().forEach(line -> sb.append(line));
        jbr.lines().forEach(line -> jsb.append(line));

        System.out.println(sb);
        System.out.println(jsb);
        
        System.out.println(new String(fromJasonToAvro(jsb.toString(), sb.toString()), StandardCharsets.UTF_8));

但我也使用 maven 插件从 avsc 创建了 avro 类(数据结构)。但现在不确定如何使用 avro message data structure 的主类和 string json 消息来生成 avro 消息?

谁能分享一下怎么做?

更新:

如何从字符串 Json 创建 Avro 对象?我的项目中已经有可用的 avro 类。

第二次更新

public class AvroInstance {

    static DecoderFactory DEFAULT_FACTORY = new DecoderFactory();
    static DatumReader<Object> reader = new GenericDatumReader<Object>(RSVP.SCHEMA$);
    static Object rsvpOB;

    public Object avroInstance(String JsonString) {

        try {
            rsvpOB = reader.read(null, DEFAULT_FACTORY.jsonDecoder(RSVP.SCHEMA$, JsonString));
        } catch (IOException e) {
            e.printStackTrace();
        }
        return rsvpOB;

    }

【问题讨论】:

标签: java json serialization avro


【解决方案1】:

您可以将您的 AVSC 文件阅读器替换为存储在生成的类中的静态 SCHEMA 字符串以获得相同的字符串...

您也可以只使用已经这样做的库

【讨论】:

  • 我已经按照您建议的方式更新了我的代码,请检查有问题的 AvroInstance 的第二次更新。你觉得好看吗?
  • 看起来不错,你为什么返回 Object 而不是 RSVP 实例?
  • 已修改为回复。但是告诉我一件事 from_avro 返回什么?
  • 我不确定你指的是什么。这不是我的答案或你的问题的一部分......但这是一个 Spark 方法,它会返回一个 Dataframe
猜你喜欢
  • 2020-10-28
  • 2021-10-04
  • 2018-03-09
  • 2018-05-17
  • 1970-01-01
  • 1970-01-01
  • 2020-05-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多