Apache spark 在分区Spark DataFrame中使用多列是否会降低读取速度?
我想知道在Spark中编写Spark数据帧时使用多列是否会使将来的读取速度变慢? 我知道为将来的过滤使用关键列进行分区可以提高读取性能,但是如果有多个列,即使是那些不能用于过滤的列,会有什么效果呢 一个样本是:Apache spark 在分区Spark DataFrame中使用多列是否会降低读取速度?,apache-spark,apache-spark-sql,Apache Spark,Apache Spark Sql,我想知道在Spark中编写Spark数据帧时使用多列是否会使将来的读取速度变慢? 我知道为将来的过滤使用关键列进行分区可以提高读取性能,但是如果有多个列,即使是那些不能用于过滤的列,会有什么效果呢 一个样本是: (ordersDF .write .format("parquet") .mode("overwrite") .partitionBy("CustomerId", "OrderDate", .....) # <----------- add many columns
(ordersDF
.write
.format("parquet")
.mode("overwrite")
.partitionBy("CustomerId", "OrderDate", .....) # <----------- add many columns
.save("/storage/Orders_parquet"))
(ordersDF
写
.格式(“拼花地板”)
.mode(“覆盖”)
.partitionBy(“CustomerId”、“OrderDate”和…)#是的,因为spark必须进行洗牌和短数据以进行分区
因为会有很多组合的分区键
即
在这个小场景中,我们需要创建1000个bucket
因此,地狱洗牌战利品,缩短>>更多时间。这不是真的-不需要洗牌here@shay__请告诉我为什么需要洗牌..或者为什么数据帧中不会有移动..OP使用的是df.write.partitionBy
,而您似乎与df.repartition
@shay\uuuuuuuu混淆。此url将帮助您混合不同的内容同一问题中的问题。数据应根据未来的查询进行分区。在任何情况下,您通常不希望按基数如此高的列(如customerId
)进行分区。最终,您的目录数将与数据集中的用户数相同。我只是发现:这会对性能产生影响。adding PartitionBy中不必要的列。使用具有有界值的列(Spark引用:为了使分区正常工作,每列中的不同值的数量通常应少于数万。)对于分区来说,具有读谓词的列是一个很好的选择,但是添加列而不在筛选中使用会影响性能。
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