如何从 Java 中的 avro 文件中提取模式

Posted

技术标签:

【中文标题】如何从 Java 中的 avro 文件中提取模式【英文标题】:How to extract schema from an avro file in Java 【发布时间】: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")
);

【问题讨论】:

【参考方案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 数据格式。

【讨论】:

以上是关于如何从 Java 中的 avro 文件中提取模式的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 PIG 将 Avro 格式存储在 HDFS 中?

我可以从 Avro 模式定义中获取 Scala 案例类定义吗?

Avro 模式中的多态性和继承

无法从 java 中的 AVRO 文件生成 CSV

如何从pyspark中的文件中匹配/提取多行模式

Schema注册和解决