我有一个配对RDD (K, V)
,其中包含time
和ID
的密钥。我希望得到(K, Iterable<V>)
形式的Pair RDD,其中键由id分组,迭代按时间排序。
我目前正在使用sortByKey().groupByKey()
并且我的测试似乎证明它有效,但我读到的情况可能并非总是如此,正如本问题所讨论的那样,答案各不相同({ {3}})。
是否正确?
谢谢!
答案 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很好地描述了这项技术。