如何使用RDD API在分区内排序(并避免跨分区排序)?

Tom*_*Tom 11 apache-spark

它是Hadoop MapReduce shuffle的默认行为,用于对分区内的shuffle键进行排序,但不是跨越分区(这是使得键跨越分区进行排序的总排序)

我会问如何使用Spark RDD实现相同的功能(在分区内排序,但不能跨分区排序)

  1. RDD的sortByKey方法是进行总排序
  2. RDD repartitionAndSortWithinPartitions正在分区内进行排序,但不是跨越分区,但不幸的是,它增加了一个额外的步骤来进行重新分区.

是否有直接的方法在分区内排序但不跨越分区?

小智 12

你可以使用DatasetsortWithinPartitions方法:

import spark.implicits._

sc.parallelize(Seq("e", "d", "f", "b", "c", "a"), 2)
  .toDF("text")
  .sortWithinPartitions($"text")
  .show

+----+
|text|
+----+
|   d|
|   e|
|   f|
|   a|
|   b|
|   c|
+----+
Run Code Online (Sandbox Code Playgroud)

通常,shuffle是排序分区的一个重要因素,因为它重用shuffle结构进行排序,而不会立即将所有数据加载到内存中.

  • 感谢@ user7849215提供了有用的答案.有没有办法用raw RDD做sortWithinPartitions? (7认同)