从Spark读取压缩的实木复合地板文件

时间:2020-07-08 08:51:31

标签: apache-spark

我有一个正在阅读的镶木地板文件:

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

这是用于读取镶木地板文件的代码段。
当文件未压缩时一切正常,但是当我gzip压缩时:

gzip fileName.parquet

然后我得到一个RuntimeException:

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

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

1 个答案:

答案 0 :(得分:1)

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

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

因此,实木复合地板是一种可以使用gzip作为其压缩算法的文件格式,但是如果您自己使用gzip压缩实木复合地板文件,它将不再是实木复合地板文件。例如,在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文件。因此,如果我创建一个文本文件并自己将其gzip压缩,如下所示:

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

还有火花:

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