如何在python中提取avro文件的模式

Posted

技术标签:

【中文标题】如何在python中提取avro文件的模式【英文标题】:How to extract schema for avro file in python 【发布时间】:2014-09-20 07:00:00 【问题描述】:

我正在尝试使用 Python Avro 库 (https://pypi.python.org/pypi/avro) 来读取由 JAVA 生成的 AVRO 文件。既然 schema 已经嵌入在 avro 文件中了,为什么还要指定一个 schema 文件呢?有没有办法自动提取?

发现另一个名为 fastavro(https://pypi.python.org/pypi/fastavro) 的包可以提取 avro 模式。 python arvo包中的手动指定模式文件是设计的吗?非常感谢。

【问题讨论】:

【参考方案1】:

在我的例子中,为了将架构作为一个“消耗性”python 字典,其中包含有用的信息,例如架构名称等,我做了以下操作:

reader: DataFileReader = DataFileReader(open(avro_file, 'rb'), DatumReader())
schema: dict = json.loads(reader.meta.get('avro.schema').decode('utf-8'))

reader.meta 是一个“按原样”非常无用的字典,因为它包含 2 个键:avro.codecavro.schema,它们都是 bytes 对象(所以我必须解析它才能访问属性)。

【讨论】:

【参考方案2】:

我使用 python 3.4 和 Avro 包 1.7.7

用于架构文件:

reader = avro.datafile.DataFileReader(open('file_name.avro',"rb"),avro.io.DatumReader())
schema = reader.meta
print(schema) 

【讨论】:

这也适用于 Python 2.7。我的导入语句如下(不知道你需要多少): import avro.schema from avro.datafile import DataFileReader from avro.io import DatumReader【参考方案3】:

/usr/local/lib/python2.7/site-packages/avro/datafile.py 的直接检查揭示了答案:

reader = avro.datafile.DataFileReader(input,avro.io.DatumReader())
schema = reader.datum_reader.writers_schema
print schema

奇怪的是,在 Java 中有一个特殊的方法:reader.getSchema()

【讨论】:

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

如何使用 Python 在现有 AVRO 文件中追加数据

如何在 Avro 模式中嵌套记录?

如何在 PySpark 中读取 Avro 文件

如何在 Pig 中使用 Avro 数据

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

Schema注册和解决