将压缩在 tar.gz 存档中的多个文件读入 Spark
Reading in multiple files compressed in tar.gz archive into Spark
我正在尝试从压缩成 tar 的几个 json 文件创建一个 Spark RDD。
比如我有3个文件
file1.json
file2.json
file3.json
这些都包含在 archive.tar.gz
中。
我想从 json 文件创建数据框。问题是 Spark 没有正确读取 json 文件。使用 sqlContext.read.json("archive.tar.gz")
或 sc.textFile("archive.tar.gz")
创建 RDD 会导致 garbled/extra 输出。
有什么方法可以处理 Spark 中包含多个文件的 gzip 压缩档案吗?
更新
使用 的答案中给出的方法我能够得到东西 运行,但是这种方法似乎不适合大型 tar.gz 档案(>200 mb 压缩),因为应用程序因大型存档而阻塞。由于我处理的一些档案在压缩后达到 2 GB,我想知道是否有一些有效的方法来处理这个问题。
我试图避免提取存档然后将文件合并在一起,因为这会很耗时。
*.tar.gz 文件中的文件,正如您已经提到的,是经过压缩的。您不能将这 3 个文件放入一个压缩的 tar 文件中,并期望导入函数(仅查找文本)知道如何处理解压缩文件,从 tar 存档中解压缩它们,以及然后单独导入每个文件。
我建议您花时间手动上传每个单独的 json 文件,因为 sc.textfile 和 sqlcontext.read.json 函数都无法处理压缩数据。
中给出了解决方案。
使用提供的代码示例,我能够从压缩存档中创建一个 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 存档转换为 Hadoop SequenceFiles
,它们是可拆分的,因此可以在 Spark 中并行读取和处理(与 tar 档案。)
参见:A Million Little Files – Digital Digressions by Stuart Sierra。
我正在尝试从压缩成 tar 的几个 json 文件创建一个 Spark RDD。 比如我有3个文件
file1.json
file2.json
file3.json
这些都包含在 archive.tar.gz
中。
我想从 json 文件创建数据框。问题是 Spark 没有正确读取 json 文件。使用 sqlContext.read.json("archive.tar.gz")
或 sc.textFile("archive.tar.gz")
创建 RDD 会导致 garbled/extra 输出。
有什么方法可以处理 Spark 中包含多个文件的 gzip 压缩档案吗?
更新
使用
我试图避免提取存档然后将文件合并在一起,因为这会很耗时。
*.tar.gz 文件中的文件,正如您已经提到的,是经过压缩的。您不能将这 3 个文件放入一个压缩的 tar 文件中,并期望导入函数(仅查找文本)知道如何处理解压缩文件,从 tar 存档中解压缩它们,以及然后单独导入每个文件。
我建议您花时间手动上传每个单独的 json 文件,因为 sc.textfile 和 sqlcontext.read.json 函数都无法处理压缩数据。
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 存档转换为 Hadoop SequenceFiles
,它们是可拆分的,因此可以在 Spark 中并行读取和处理(与 tar 档案。)
参见:A Million Little Files – Digital Digressions by Stuart Sierra。