在分区 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 中创建分区