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

2024-03-07

我正在尝试从压缩成 tar.gz 文件的几个 json 文件创建 Spark RDD。 例如我有3个文件

file1.json
file2.json
file3.json

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

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

Spark 中是否有某种方法可以处理包含多个文件的 gzip 压缩档案?

UPDATE

使用答案中给出的方法从 Spark 中的压缩中读取整个文本文件 https://stackoverflow.com/questions/36604145/read-whole-text-files-from-a-compression-in-spark我能够让事情运行起来,但这种方法似乎不适合大型 tar.gz 档案(>200 mb 压缩),因为应用程序会因大型档案大小而阻塞。作为我正在处理的一些档案,其范围可达2 GB压缩后我想知道是否有一些有效的方法来处理这个问题。

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


给出了一个解决方案从 Spark 中的压缩中读取整个文本文件 https://stackoverflow.com/questions/36604145/read-whole-text-files-from-a-compression-in-spark。 使用提供的代码示例,我能够创建一个DataFrame从压缩档案中,如下所示:

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

See: 一百万个小文件——Stuart Sierra 的数字题外话 https://stuartsierra.com/2008/04/24/a-million-little-files.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将 tar.gz 存档中压缩的多个文件读入 Spark [重复] 的相关文章

随机推荐