如何从 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<GenericRecord>.OpenReader(filename);
来实例化 dataFileReader
。实例化后,dataFileReader 就像在 Java 中一样使用。
我正在尝试从字节数组而不是文件(同时包含模式和有效负载)中读取模式和数据。我该怎么做?【参考方案3】:
感谢@Helder Pereira 的回答。作为补充,模式也可以从GenericRecord
实例的getSchema()
中获取。Here 是关于它的现场演示,上面的链接显示了如何在 java 中为Parquet
获取数据和模式, ORC
和 AVRO
数据格式。
【讨论】:
以上是关于如何从 Java 中的 avro 文件中提取模式的主要内容,如果未能解决你的问题,请参考以下文章