我正在尝试从压缩成 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(使用前将#替换为@)