将tar.gz存档中压缩的多个文件读入Spark

隔膜

我正在尝试从压缩为tar的多个json文件创建Spark RDD。例如,我有3个文件

file1.json
file2.json
file3.json

这些都包含在中archive.tar.gz

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

有什么方法可以处理Spark中包含多个文件的压缩存档?

更新

使用答案中给出的方法从Spark压缩中读取整个文本文件,我能够使事情运行,但是由于应用程序阻塞,此方法似乎不适用于大型tar.gz归档文件(压缩后大于200 mb)依靠大档案。作为一些档案,压缩后我要处理的最大范围为2 GB,我想知道是否有某种有效的方法来解决该问题。

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

隔膜

从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 SequenceFile,它们是可拆分的,因此可以在Spark中并行读取和处理(与tar存档相反)。

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

解压缩tar.gz文件

使用Commons Compress将目录压缩为tar.gz

将解压缩的tar.gz复制到单个文件

将tar.gz文件解压缩到目录并创建目录(如果不存在)

如何完全从Java中的内存(无文件)中的对象创建tar或tar.gz存档

如何从tar.gz存档中删除单个文件

Python将文本写入.tar.gz

从Nim中的tar.gz存档中读取文件

如何将压缩的(gz)CSV文件读入dask数据框?

将文件夹压缩成多个zip存档

将tar存档输出到bash脚本中的特定路径

提取tar.gz文件将返回“看起来不像tar存档”。

如何使用gunzip和tar将tar.gz文件解压缩到所需的特定目录?

tar.gz在压缩之前或之后将gzip文件压缩到tar中吗?

将.tar.gz存档解压缩到特定目录

如何将tar gz存档解压缩到特定的目标?

如何使用lzma将多个文件压缩到一个存档中?

tar目录,以将文件归档到要压缩的目录中

如何将多个文件压缩到.xz存档中?

将tar存档解压缩到git-bash中的现有目录

分割tar.gz后将.tar.gz转换为序列文件

无法将文件添加到tar:存档/ tar:不支持套接字

将Tar目录存入与目录同名的存档中?

tar +将文件夹压缩到tar.gz并删除该文件夹

正确区分压缩的.gz文件和存档的tar.gz文件?

如何编写一个外壳程序来将文件从.csv压缩到.tar.gz?

将tar存档写入磁带,然后提取单个文件

从python中的tar存档中提取压缩的gz文件

如何将多个文件夹压缩到单独的另一个文件夹和 tar.gz