在分区 Spark DataFrame 中使用多列是不是会使读取速度变慢?

Posted

技术标签:

【中文标题】在分区 Spark DataFrame 中使用多列是不是会使读取速度变慢?【英文标题】:Does using multiple columns in partitioning Spark DataFrame makes read slower?在分区 Spark DataFrame 中使用多列是否会使读取速度变慢? 【发布时间】:2020-05-19 03:58:37 【问题描述】:

我想知道在 spark 中编写 Spark DataFrame 时使用多列是否会使将来的读取速度变慢? 我知道为未来过滤使用关键列进行分区可以提高读取性能,但是拥有多个列会产生什么影响,即使是那些不可用于过滤的列?

一个样本是:

(ordersDF
  .write
  .format("parquet")
  .mode("overwrite")
  .partitionBy("CustomerId", "OrderDate", .....) # <----------- add many columns
  .save("/storage/Orders_parquet"))

【问题讨论】:

您在同一个问题中混合了不同的问题。数据应该根据未来的查询进行分区。无论如何,您通常不希望按具有如此高基数的列进行分区,例如customerId。您最终将获得与数据集中的用户一样多的目录。 我只是发现:在 PartitionBy 中添加不必要的列会影响性能。使用具有有界值的列(Spark 参考:为了使分区正常工作,每列中不同值的数量通常应少于数万。)将具有读取谓词将是分区的绝佳选择。但是添加不用于过滤的列会影响性能。 【参考方案1】:

是的,因为 spark 必须做 shuffle 和 short data 才能进行分区。

因为会有很多分区键组合。

 suppose CustomerId have unique values  10 
 suppose orderDate have unique values   10 
 suppose Orderhave unique values        10 

 Number of partition will be 10 *10*10

在这个小场景中,我们需要创建 1000 个存储桶。

所以洗牌和短的地狱战利品>>更多时间。

【讨论】:

这不是真的 - 这里不需要洗牌 @shay__ 请让我知道为什么需要 shuffle .. 或者为什么数据帧不会移动 .. OP 使用的是df.write.partitionBy,而你似乎与df.repartition 混淆了。 @shay__ 这个网址将有助于***.com/questions/50775870/…

以上是关于在分区 Spark DataFrame 中使用多列是不是会使读取速度变慢?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Spark 中使用 Python 查找 DataFrame 中的分区数以及如何在 Spark 中使用 Python 在 DataFrame 中创建分区

合并 Spark DataFrame 中的多列 [Java]

在 spark Dataframe 中动态创建多列

使用 Spark DataFrame 中的多列更改行的值

多列上的 Spark 动态分区覆盖产生空白输出

从 Spark DataFrame 中的单列派生多列