通过存储已排序的Parquet文件来增强Spark性能

Pow*_*ers 6 sorting apache-spark parquet

如果DataFrame在被保存为Parquet文件之前进行排序,数据提取会更快地运行.

假设我们有以下peopleDfDataFrame(假装这是一个样本而真正的那个有200亿行):

+-----+----------------+
| age | favorite_color |
+-----+----------------+
|  54 | blue           |
|  10 | black          |
|  13 | blue           |
|  19 | red            |
|  89 | blue           |
+-----+----------------+
Run Code Online (Sandbox Code Playgroud)

让我们将这个DataFrame的已排序和未排序版本写出到Parquet文件.

peopleDf.write.parquet("s3a://some-bucket/unsorted/")
peopleDf.sort($"favorite_color").write.parquet("s3a://some-bucket/sorted/")
Run Code Online (Sandbox Code Playgroud)

在读取排序数据并基于数据提取时,是否有任何性能提升favorite_color

val pBlue1 = spark.read.parquet("s3a://some-bucket/unsorted/").filter($"favorite_color" === "blue")

// is this faster?

val pBlue2 = spark.read.parquet("s3a://some-bucket/sorted/").filter($"favorite_color" === "blue")
Run Code Online (Sandbox Code Playgroud)

小智 3

排序有很多好处:

  • 使用文件元数据进行更有效的过滤。
  • 更有效的压缩率。

如果您想过滤单列分区,该列可以更有效并且不需要洗牌,尽管现在存在一些相关问题: