使用Python读取AVRO文件

4
我有一个由JAVA创建的AVRO文件,似乎是一种用于hadoop/mapreduce的压缩文件,我想将其“解压缩”(反序列化)为平面文件。每条记录每行。
我了解到Python有一个AVRO package,并且我已经正确安装它。并运行示例以读取AVRO文件。但是,它出现了下面的错误,我想知道在阅读最简单的示例时发生了什么?有人能帮我解释下面的错误吗?
>>> reader = DataFileReader(open("/tmp/Stock_20130812104524.avro", "r"), DatumReader())
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/.../python2.7/site-packages/avro/datafile.py", line 240, in __init__
    raise DataFileException('Unknown codec: %s.' % self.codec)
avro.datafile.DataFileException: Unknown codec: snappy.

顺便提一句,如果我对文件进行“头”操作,并使用VI打开AVRO文件的前几行,我可以看到模式定义以及一些垃圾奇怪的字符——可能是压缩内容。原始AVRO文件的起始位如下:

bj^A^D^Tavro.codec^Lsnappy^Vavro.schemaØ${"type":"record","name":"Stoc...

我不知道是否需要这些模式来读取AVRO文件,就像下面这样:

schema = avro.schema.parse(open("schema").read())
# include schema to do sth...
reader = DataFileReader(open("Stock_20130812104524.avro", "r"), DatumReader())

提前感谢。


Java和Avro不是首字母缩略词。请参考https://en.wikipedia.org/wiki/Acronym。 - Steve Kuo
@Steve Kuo,您可以使用各种语言创建AVRO文件,例如使用JAVA/Python/EXCEL创建CSV文件,对吧?我并不是说AVRO文件只能由JAVA创建,只是为了让读者更多地了解文件的来源...不知道这是否有帮助或误导。 - B.Mr.W.
1
我只是指出Java和Avro是单词,而不是首字母缩写,因此不应该全部大写书写。 - Steve Kuo
3个回答

6
尝试运行pip install python-snappy命令 - 确保您已经先安装了snappy

我尝试过了,但没有成功。它抱怨缺少snappy-c.h等等,导致失败。我是否需要先将Google Snappy C库放入环境路径中等等才能使Python安装工作?我感觉Snappy可能是解决方案 :) 谢谢 - B.Mr.W.
是的,您必须首先安装我提供链接的 snappy C 库。它在这里:https://code.google.com/p/snappy/ - 或者可能已经打包到您的 Linux 发行版 / Mac OS homebrew 中。 - chlunde
2
对于Ubuntu,请参见如何启用“宇宙”存储库?,并运行apt-get install python-snappy libsnappy1 libsnappy-dev - chlunde
@B.Mr.W. 你成功了吗?还是 ".avro" 文件是公开的? - chlunde
我正在公司的环境中工作,嵌套依赖项可能不容易安装。最终我使用了一行代码的JAVA来解决这个问题。 - B.Mr.W.

2

问题在于,如果没有安装Xcode命令行工具,则无法让snappy正常工作。您可以通过在命令提示符处键入gcc来检查是否已安装。如果未安装,则键入xcode-select --install进行安装。然后安装python-snappy应该就可以了。感谢Bin!


-1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接