读取tar.gz归档中压缩的多个文件到Spark中

时间:2016-07-28 12:06:48

标签: scala apache-spark gzip rdd

我试图从压缩成tar的几个json文件创建一个Spark RDD。 例如,我有3个文件

file1.json
file2.json
file3.json

这些内容包含在archive.tar.gz

我想从json文件创建一个数据框。问题是Spark没有正确读取json文件。使用sqlContext.read.json("archive.tar.gz")sc.textFile("archive.tar.gz")创建RDD会导致出现乱码/额外输出。

有没有办法在Spark中处理包含多个文件的gzip压缩文件?

更新

使用Read whole text files from a compression in Spark答案中给出的方法,我能够运行,但这种方法似乎不适合大型tar.gz档案(> 200 mb压缩),因为应用程序扼流圈大型存档大小。由于我在处理压缩后达到 2 GB 范围内的一些档案,我想知道是否有一种有效的方法来解决问题。

我试图避免提取档案,然后将文件合并在一起,因为这会非常耗时。

2 个答案:

答案 0 :(得分:6)

Read whole text files from a compression in Spark中给出了一个解决方案。 使用提供的代码示例,我能够从压缩存档创建数据帧,如下所示:

val jsonRDD = sc.binaryFiles("gzarchive/*").
               flatMapValues(x => extractFiles(x).toOption).
               mapValues(_.map(decode())

val df = sqlContext.read.json(jsonRDD.map(_._2).flatMap(x => x))

此方法适用于相对较小的tar档案,但不适用于较大的档案大小。

问题的一个更好的解决方案似乎是将tar档案转换为hadoop SequenceFiles,它们是可拆分的,因此可以在Spark中并行读取和处理(而不是tar档案。)

见:stuartsierra.com/2008/04/24/a-million-little-files

答案 1 :(得分:-1)

正如您已经提到的那样,* .tar.gz文件中的文件是压缩的。您不能将3个文件放入单个压缩的tar文件中,并期望导入功能(仅查找文本)知道如何处理解压缩文件,从tar存档解压缩它们,然后单独导入每个文件。

我建议您花点时间手动上传每个单独的json文件,因为sc.textfile和sqlcontext.read.json函数都无法处理压缩数据。