所以我在从HDFS解密snappy文件时遇到了一些问题。如果我使用hadoop fs -text
我能够解压缩并输出文件只是文件。但是,如果我使用hadoop fs -copyToLocal
并尝试用python-snappy解压缩文件,我会得到
snappy.UncompressError:解压缩时出错:输入无效
我的python程序非常简单,看起来像这样:
import snappy
with open (snappy_file, "r") as input_file:
data = input_file.read()
uncompressed = snappy.uncompress(data)
print uncompressed
这对我来说是悲惨的。所以我尝试了另一个文本,我从hadoop fs -text
获取输出并使用 python-snappy 库对其进行压缩。然后我把它输出到一个文件。然后,我能够读取此文件并将其解压缩。
AFAIK snappy在版本之间向后兼容。我的python代码使用的是最新的snappy版本,我猜猜hadoop使用的是较旧的snappy版本。这可能是个问题吗?或者我在这里还缺少什么?
答案 0 :(得分:3)
好吧我好好理解了。事实证明,我使用的是使用hadoop框架格式压缩的文件上的原始模式解压缩。即使我在0.5.1中尝试过StreamDecompressor,它仍然会因帧错误而失败。 python-snappy 0.5.1默认为新的snappy framing format,因此无法解压缩hadoop snappy文件。
原来,主版本0.5.2增加了对hadoop成帧格式的支持。一旦我构建了它并导入它,我就可以轻松地解压缩文件了:
with open (snappy_file, "r") as input_file:
data = input_file.read()
decompressor = snappy.hadoop_snappy.StreamDecompressor()
uncompressed = decompressor.decompress(data)
现在唯一的问题是,这在技术上还不是一个pip版本,所以我想我必须等待或者只是从源代码中使用构建。