Spark分区无法按预期运行

时间:2019-01-08 11:17:37

标签: apache-spark apache-spark-sql datastax parquet

我正在使用spark-sql 2.3.1,我已设置

spark.sql.shuffle.partitions=40 

在我的代码中

val partitioned_df =  vals_df.repartition(col("model_id"),col("fiscal_year"),col("fiscal_quarter"))

当我说

println(" Number of partitions : " + partitioned_df.rdd.getNumPartitions)

它给出40作为输出,实际上分区后理想情况下计数应该在400左右,为什么分区在这里不起作用?我在这弄错了什么?如何解决?

2 个答案:

答案 0 :(得分:2)

这是意料之中的,the scaladoc for repartition指出:

  

返回由给定分区分区的新数据集   表达式,使用spark.sql.shuffle.partitions作为数量   分区。结果数据集经过哈希分区。

也许您对重新分区的理解是错误的。当按列c重新分区时,c的所有具有相同值的行都在同一分区中,但是1个分区可以容纳c的多个值

答案 1 :(得分:1)

set spark.sql.shuffle.partitions=40

这仅适用于JOIN和AGGregations。

尝试这样的事情-我自己的示例:

val df2 = df.repartition(40, $"c1", $"c2")

这是

的输出
val df2 = df.repartition(40, $"c1", $"c2").explain 

== Physical Plan ==
Exchange hashpartitioning(c1#114, c2#115, 40)
...

可以动态设置num分区:

n = some calculation
val df2 = df.repartition(n, $"c1", $"c2").explain