从 Spark 读取 gzipped parquet 文件

JBo*_*Boy 5 apache-spark

我有一个镶木地板文件,正在用 Spark 阅读:

SparkSession.builder()
    .appName("test")
    .config("spark.sql.parquet.compression.codec", "gzip")
    .read().parquet(resourcePath)
Run Code Online (Sandbox Code Playgroud)

这是用于读取 parquet 文件的代码片段。
当文件未压缩时一切正常,但是当我对其进行 gzip 压缩时:

gzip fileName.parquet
Run Code Online (Sandbox Code Playgroud)

然后我得到一个 RuntimeException:

is not a Parquet file. expected magic number at tail [80, 65, 82, 49] but found [44, 64, 91, 0]
Run Code Online (Sandbox Code Playgroud)

但应该支持 gzip 格式,它是支持的,我在这里做错了什么?

Oli*_*Oli 4

Spark 和 Parquet 支持 Gzip,但不是这样的。

Apache Parquet 是 Apache Hadoop 生态系统的一种免费开源的面向列的数据存储格式。[...]它提供了高效的数据压缩和编码方案,具有增强的性能,可以批量处理复杂的数据。

所以parquet是一种可以使用gzip作为其压缩算法的文件格式,但是如果你自己用gzip压缩parquet文件,它就不再是parquet文件了。例如,在 Spark 中你可以这样做:

val spark = SparkSession.builder
    .config("spark.sql.parquet.compression.codec", "gzip")
    .getOrCreate
spark.range(10).write.parquet(".../test.parquet")
Run Code Online (Sandbox Code Playgroud)

如果我看一下test.parquet,它是一个包含 gzip 文件的目录:

> cat test.parquet/
part-00000-890dc5e5-ccfe-4e60-877a-79585d444149-c000.gz.parquet
part-00001-890dc5e5-ccfe-4e60-877a-79585d444149-c000.gz.parquet
_SUCCESS
Run Code Online (Sandbox Code Playgroud)

Spark 还支持 gzip 文件。因此,如果我创建一个文本文件并自己对其进行 gzip,如下所示:

> cat file.txt
ab
cd
> gzip file.txt
Run Code Online (Sandbox Code Playgroud)

并带有火花:

scala> sc.textFile("hdfs:///tmp/file.txt.gz").collect
res6: Array[String] = Array(ab, cd)
Run Code Online (Sandbox Code Playgroud)