我有一个镶木地板文件,正在用 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 格式,它是支持的,我在这里做错了什么?
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)