使用Spark读取压缩的Parquet文件

4

我有一个parquet文件,我正在用Spark读取:

SparkSession.builder()
    .appName("test")
    .config("spark.sql.parquet.compression.codec", "gzip")
    .read().parquet(resourcePath)

这是用于读取parquet文件的代码片段。
当文件未经压缩时,一切正常,但当使用gzip压缩它时:
gzip fileName.parquet

然后我遇到了一个运行时异常:

is not a Parquet file. expected magic number at tail [80, 65, 82, 49] but found [44, 64, 91, 0]

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

4

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

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")

如果我查看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

Spark也支持gzip文件。因此,如果我创建一个文本文件并像这样自己压缩它:

> cat file.txt
ab
cd
> gzip file.txt

而且使用Spark:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接