Spark按键排序然后分组以获得有序可迭代?

时间:2015-04-22 08:51:04

标签: sorting apache-spark

我有一个配对RDD (K, V),其中包含timeID的密钥。我希望得到(K, Iterable<V>)形式的Pair RDD,其中键由id分组,迭代按时间排序。

我目前正在使用sortByKey().groupByKey()并且我的测试似乎证明它有效,但我读到的情况可能并非总是如此,正如本问题所讨论的那样,答案各不相同({ {3}})。

是否正确?

谢谢!

2 个答案:

答案 0 :(得分:8)

The answer from Matei,我认为这个主题具有权威性,非常明确:

  

实际上并不保证订单,只有哪些按键最终会在每个按键中结束   划分。 Reducers可以从任意地图中获取地图任务中的数据   订单,取决于哪些可用。如果你想要一个   具体的顺序,你应该排序每个分区。你可能在这里   得到它,因为每个分区最终只有一个元素,和   collect()确实按顺序返回分区。

在这种情况下,更好的选择是将排序应用于每个键的结果集合:

rdd.groupByKey().mapValues(_.sorted)

答案 1 :(得分:0)

Spark Programming Guide提供三种选择,如果一个人希望在随机播放后可预测的有序数据:

  
      
  • mapPartitions使用例如.sorted
  • 对每个分区进行排序   
  • repartitionAndSortWithinPartitions在重新分区的同时有效地对分区进行排序
  •   
  • sortBy制作全球订购的RDD
  •   

Spark API中所述,repartitionAndSortWithinPartitions比调用重新分区然后在每个分区内排序更有效,因为它可以将排序推送到随机播放器中。

然而,排序是通过仅查看元组K的键(K, V)来计算的。诀窍是将所有相关信息放在元组的第一个元素中,如((K, V), null),定义自定义分区器和自定义排序。 This article很好地描述了这项技术。