【问题标题】:How to extract schema from an avro file in Java如何从 Java 中的 avro 文件中提取模式
【发布时间】:2018-01-11 19:13:36
【问题描述】:

如何从 Java 中的 avro 文件中先提取模式,然后再提取数据?与this 问题相同,但在 java 中除外。

我已经看到了如何从 avsc 文件而不是 avro 文件获取架构的示例。我应该往哪个方向看?

Schema schema = new Schema.Parser().parse(
    new File("/home/Hadoop/Avro/schema/emp.avsc")
);

【问题讨论】:

    标签: java avro avro-tools


    【解决方案1】:

    您可以使用此处显示的数据块库https://github.com/databricks/spark-avro,它将 avro 文件加载到Dataframe (Dataset<Row>)

    一旦有了Dataset<Row>,就可以直接使用df.schema()获取架构

    【讨论】:

    • 抱歉,我刚刚意识到您并没有真正开始使用 Spark。如果您还没有使用 Spark,那么我的解决方案是麻烦多于其价值。不过,我会留下答案,以防来自 Spark 视角的人有同样的问题
    • 我没有使用 Spark。只是普通的香草 avro 工具罐,但谢谢。
    【解决方案2】:

    如果您想知道 Avro 文件的架构而不需要生成相应的类或关心文件属于哪个类,可以使用GenericDatumReader

    DatumReader<GenericRecord> datumReader = new GenericDatumReader<>();
    DataFileReader<GenericRecord> dataFileReader = new DataFileReader<>(new File("file.avro"), datumReader);
    Schema schema = dataFileReader.getSchema();
    System.out.println(schema);
    

    然后就可以读取文件里面的数据了:

    GenericRecord record = null;
    while (dataFileReader.hasNext()) {
        record = dataFileReader.next(record);
        System.out.println(record);
    }
    

    【讨论】:

    • 对于那些使用 C# Avro Apache 库的人,可以使用实用函数 DataFileReader&lt;GenericRecord&gt;.OpenReader(filename); 来实例化 dataFileReader。实例化后,dataFileReader 就像在 Java 中一样使用。
    • 我正在尝试从字节数组而不是文件(同时包含模式和有效负载)中读取模式和数据。我该怎么做?
    【解决方案3】:

    感谢@Helder Pereira 的回答。作为补充,模式也可以从GenericRecord 实例的getSchema() 中获取。
    Here 是关于它的现场演示,上面的链接显示了如何在 java 中为Parquet 获取数据和模式, ORCAVRO 数据格式。

    【讨论】:

      猜你喜欢
      • 2014-09-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多