将tar.gz压缩成多个文件压入Spark

问题描述:

我试图从几个json文件压缩成一个tar来创建一个Spark RDD。 例如,我有3个文件将tar.gz压缩成多个文件压入Spark

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压缩文件?

UPDATE

使用的答案给Read whole text files from a compression in Spark的方法我能得到的东西运行,但这种方法似乎并不适用于大型的tar.gz档案(> 200 MB压缩)作为该应用程序在大档案大小上窒息。由于我正在处理的一些压缩文件的压缩率高达2 GB我想知道是否有一些有效的方法来处理这个问题。

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

+0

我面对大文件的同样的问题,你找到一个解决方案(除了手动解压缩,然后加载到火花)? :) – ixaxaar

+0

@ixaxaar,我最终将所有的tar档案转换为Spark很好地工作的hadoop序列文件。 https://stuartsierra.com/2008/04/24/a-million-little-files – septra

+0

非常感谢罐子!我实际上有50个tar文件,每个文件有一百万个小(json)文件:D – ixaxaar

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

这种方法工作正常尺寸相对较小的tar归档,但不适合大型档案大小。

一个更好的解决问题的办法似乎是转换的tar归档到HADOOP SequenceFiles,其是可分离的,并因此可以读取和在火花并行处理

见(相对于tar归档。): stuartsierra.com/2008/04/24/a-million-little-files

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

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