对于一个大数据项目,我打算使用Spark,它有一些不错的功能,例如针对重复工作负载的内存计算。它可以运行在本地文件或者HDFS之上。
然而,在官方文档中,我找不到任何关于如何处理gzip文件的提示。实际上,处理.gz文件可能比未压缩的文件更有效率。
是否有一种方法手动实现读取gzipped文件,或者说在读取.gz文件时自动进行解压缩?
来自Spark Scala编程指南中的“Hadoop数据集”章节:
Spark可以从存储在Hadoop分布式文件系统(HDFS)或Hadoop支持的其他存储系统(包括本地文件系统、Amazon S3、Hypertable、HBase等)中的任何文件创建分布式数据集。Spark支持文本文件、SequenceFiles和任何其他Hadoop InputFormat。
支持gzip输入文件的方式与Hadoop相同。例如,sc.textFile("myFile.gz")
应该会自动解压缩并读取gzip压缩文件(textFile()
实际上是使用了Hadoop的TextInputFormat
,它支持gzip压缩文件)。
正如@nick-chammas在评论中提到的那样:
请注意,如果您在一个gzip文件上调用sc.textFile()
,Spark将只为您提供一个仅有1个分区的RDD(截至0.9.0)。这是因为gzip文件不可分割。如果您不以某种方式重新分区RDD,则对该RDD的任何操作都将受限于单个核心。
.gz
文件扩展名。我有一个压缩文件,用sc.textFile()
读取得很好,但当我改变扩展名时,它返回字节字符串,例如somefile.gz.bkp
。 - gmajivu