我正在尝试从压缩为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] 删除。
我来说两句