如何在Python中提取Avro文件的模式
我正在尝试使用Python的Avro库(https://pypi.python.org/pypi/avro)来读取一个由JAVA生成的AVRO文件。因为这个AVRO文件里已经包含了模式(schema),那我为什么还需要指定一个模式文件呢?有没有办法可以自动提取出来?
我发现还有一个叫做fastavro的包(https://pypi.python.org/pypi/fastavro)可以提取AVRO模式。那在Python的avro包里手动指定模式文件是设计上的要求吗?非常感谢。
3 个回答
2
在我的情况下,为了得到一个可以使用的Python字典,这个字典里包含一些有用的信息,比如模式名称等等,我做了以下操作:
reader: DataFileReader = DataFileReader(open(avro_file, 'rb'), DatumReader())
schema: dict = json.loads(reader.meta.get('avro.schema').decode('utf-8'))
这里的 reader.meta
是一个字典,直接拿来用其实没什么用,因为它只包含两个键:avro.codec
和 avro.schema
,这两个键的值都是 bytes
对象(所以我需要对它进行解析才能访问里面的属性)。
10
直接查看一下 /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()
。
14
我使用的是Python 3.4和Avro包的1.7.7版本。
对于模式文件,我使用:
reader = avro.datafile.DataFileReader(open('file_name.avro',"rb"),avro.io.DatumReader())
schema = reader.meta
print(schema)