pyspark如何加载压缩的snappy文件

时间:2015-04-25 21:59:19

标签: apache-spark pyspark snappy

我使用python-snappy压缩了一个文件并将其放在我的hdfs存储中。我现在正试图像这样阅读它,但我得到以下追溯。我无法找到如何读取文件的示例,以便我可以处理它。我可以读取文本文件(未压缩)版本。我应该使用sc.sequenceFile吗?谢谢!

I first compressed the file and pushed it to hdfs

python-snappy -m snappy -c gene_regions.vcf gene_regions.vcf.snappy
hdfs dfs -put gene_regions.vcf.snappy /

I then added the following to spark-env.sh
export SPARK_EXECUTOR_MEMORY=16G                                                
export HADOOP_HOME=/usr/local/hadoop                                            

export JAVA_LIBRARY_PATH=$JAVA_LIBRARY_PATH:$HADOOP_HOME/lib/native             
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$HADOOP_HOME/lib/native                 
export SPARK_LIBRARY_PATH=$SPARK_LIBRARY_PATH:$HADOOP_HOME/lib/native           
export SPARK_CLASSPATH=$SPARK_CLASSPATH:$HADOOP_HOME/lib/lib/snappy-java-1.1.1.8-SNAPSHOT.jar

I then launch my spark master and slave and finally my ipython notebook where I am executing the code below.

a_file = sc.textFile("hdfs://master:54310/gene_regions.vcf.snappy")
a_file.first()

ValueError Traceback(最近一次调用最后一次)  in() ----> 1 a_file.first()

/home/user/Software/spark-1.3.0-bin-hadoop2.4/python/pyspark/rdd.pyc in first(self)    1244如果rs:    1245返回rs [0] - > 1246引发ValueError(" RDD为空")    1247    1248 def isEmpty(self):

ValueError:RDD为空

Working code (uncompressed) text file
a_file = sc.textFile("hdfs://master:54310/gene_regions.vcf")
a_file.first()

输出: U' ## FILEFORMAT = VCFv4.1'

4 个答案:

答案 0 :(得分:2)

这里的问题是python-snappy与Hadoop的snappy编解码器不兼容,这是Spark在看到“.snappy”后缀时用来读取数据的。它们基于相同的基础算法,但它们不兼容,因为您可以使用一个压缩并使用另一个解压缩。

您可以通过使用Spark或Hadoop将数据首先写入snappy来实现此功能。或者让Spark将您的数据读取为二进制blob,然后自己手动调用python-snappy解压缩(请参阅这里的binaryFiles http://spark.apache.org/docs/latest/api/python/pyspark.html)。二进制blob方法稍微脆一些,因为它需要将整个文件放在内存中以适应每个输入文件。但是,如果您的数据足够小,那就可以了。

答案 1 :(得分:1)

接受的答案现已过时。您可以使用 python-snappy 来压缩 hadoop-snappy,但几乎没有文档。 示例:

import snappy
with open('test.json.snappy', 'wb') as out_file:
    data=json.dumps({'test':'somevalue','test2':'somevalue2'}).encode('utf-8')
    compressor = snappy.hadoop_snappy.StreamCompressor()
    compressed = compressor.compress(data)
    out_file.write(compressed)

您也可以使用命令行,其中使用 -t hadoop_snappy 标志的选项更直接一些。示例:

echo "{'test':'somevalue','test2':'somevalue2'}" | python -m snappy -t hadoop_snappy -c - test.json.snappy

答案 2 :(得分:0)

好吧我找到了解决方案!

建立这个...... https://github.com/liancheng/snappy-utils 在ubuntu 14.10上我必须安装gcc-4.4才能让我建立评论我在这里看到的错误 https://code.google.com/p/hadoop-snappy/issues/detail?id=9

我现在可以在命令行使用snappy压缩文本文件,如此

snappy -c gene_regions.vcf -o gene_regions.vcf.snappy

将其转储到hdfs

hdfs dfs -put gene_regions.vcf.snappy

然后将其加载到pyspark中!

a_file = sc.textFile("hdfs://master:54310/gene_regions.vcf.snappy")
a_file.first()

瞧! vcf的标题......

u'##fileformat=VCFv4.1'

答案 3 :(得分:0)

不确定我的文件到底有哪个snappy编解码器,但是spark.read.text对我来说没有问题。