apache-spark - pyspark 如何加载压缩的 snappy 文件

标签 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 回溯(最近一次调用)
在 ()
----> 1 a_file.first()

/home/user/Software/spark-1.3.0-bin-hadoop2.4/python/pyspark/rdd.pyc 在第一个(自我)
1244 如果 rs:
第1245回
-> 1246 引发 ValueError(“RDD 为空”)
1247
1248 def isEmpty(自我):

值错误:RDD 为空
Working code (uncompressed) text file
a_file = sc.textFile("hdfs://master:54310/gene_regions.vcf")
a_file.first()

输出:
u'##fileformat=VCFv4.1'

最佳答案

这里的问题是 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 方法有点脆弱,因为它需要为每个输入文件将整个文件放入内存中。但是,如果您的数据足够小,那将起作用。

关于apache-spark - pyspark 如何加载压缩的 snappy 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29871209/

相关文章:

python - PySpark:减去两个时间戳列并以分钟为单位返回差异(使用 F.datediff 仅返回一整天)

java - SnappyFramedInputStream 与 SnappyInputStream

hive - Hive 如何使用 parquet 和 snappy 创建表

需要 libsnappy 的 C++ 程序

apache-spark - 如何在执行器中获取工作目录

r - 如何使用 R 或 SparkR 调用 SparkMLLib 算法?

python - 如何使用pyspark创建包含大量列和日期数据的数据框?

python - pyspark:使用模式加入?或者将模式转换为列表?

python - Mosaic `st_buffer` 不返回点或多边形类型的几何图形

python - 如何使用 StandardScaler 标准化 Spark 中的一列?