当我在 spark/scala 中使用 window.partitionBy() 函数时,如何保持分区编号不变?

men*_*gwu 4 scala apache-spark apache-spark-sql

我有一个RDD,则RDD' partition结果变为200,当我使用window,我不能改变partition,当我使用window

这是我的代码:

val rdd= sc.parallelize(List(1,3,2,4,5,6,7,8),4)
val result = rdd.toDF("values").withColumn("csum", sum(col("values")).over(Window.partitionBy(col("values")))).rdd
println(result.getNumPartitions + "rdd2")
Run Code Online (Sandbox Code Playgroud)

我的输入分区是4,为什么结果分区是200?

我希望我的结果分区也是 4。

有没有更清洁的解决方案?

Yar*_*ron 5

注意:正如@eliasah 所提到的 - 使用带 spark 的窗口函数时无法避免重新分区


  • 为什么结果分区是 200?

Spark doc 默认值spark.sql.shuffle.partitions配置用于连接或聚合的数据混洗时要使用的分区数 - 为 200

  • 我怎样才能重新分区到4?

您可以使用:

coalesce(4)
Run Code Online (Sandbox Code Playgroud)

或者

repartition(4)
Run Code Online (Sandbox Code Playgroud)

火花文档

coalesce(numPartitions) 将 RDD 中的分区数减少到 numPartitions。在过滤大型数据集后更有效地运行操作很有用。

repartition(numPartitions)随机重组 RDD 中的数据以创建更多或更少的分区并在它们之间进行平衡。这总是在网络上打乱所有数据。