Hadoop MapReduce洗牌的默认行为是在分区内对混叠键进行排序,而不是跨分区排序(使键跨分区排序的是总顺序)。
我会问如何使用Spark (分区内排序,但不是跨分区排序)实现相同的目标。
sortByKey方法是进行全排序repartitionAndSortWithinPartitions是在分区内进行排序,而不是跨分区,但不幸的是,它增加了一个额外的步骤来执行重新分区。是否有一种直接的方法在分区内排序,而不是跨分区?
发布于 2017-04-11 07:52:53
您可以使用Dataset和sortWithinPartitions方法:
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|
+----+通常,洗牌是排序分区的一个重要因素,因为它重用混洗结构来排序,而不将所有数据一次加载到内存中。
发布于 2018-11-13 07:51:09
我以前从来没有这样的需求,但我的第一猜测是使用任何*Partition*方法(例如,foreachPartition或mapPartitions)在每个分区中进行排序。
因为它们给您一个Scala Iterator,所以您可以使用it.toSeq,然后应用序列号的任何排序方法,例如sortBy、sortWith或sorted。
https://stackoverflow.com/questions/43339027
复制相似问题