Apache Spark RDD sortByKey的Big-O时间复杂度是多少?
我正在尝试根据特定订单为RDD分配行号。
假设我有{K,V}对RDD,我希望使用
按键执行订单myRDD.sortByKey(true).zipWithIndex
此操作的时间复杂度是多少?
幕后发生了什么?泡泡排序?我希望不是!我的数据集非常大并且跨越分区,所以我很好奇sortByKey函数是否是最优的,或者在分区中做某种中间数据结构,然后在分区之间做其他事情来优化消息传递,或者是什么。 / p>
答案 0 :(得分:2)
快速查看代码显示正在使用RangePartitioner。文档说:
按范围将可排序记录按粗略划分 *相等的范围。范围是通过对
中传递的RDD的内容进行抽样来确定的
所以本质上你的数据被采样(O [n]),然后只对排序的唯一样本密钥(m)进行排序(O [m log(m)])和确定的密钥范围,然后是整个数据随机排列(O [n],但代价高昂),然后内部对给定分区上接收的密钥范围进行排序(O [p log [p))。
{{1}}可能使用本地大小来分配号码,使用分区号,因此可能存储分区元数据以实现此效果:
将此RDD与其元素索引一起拉出。排序首先基于分区索引 *然后是每个分区内的项目顺序。所以第一项是第一项 * partition获取索引0,最后一个分区中的最后一项获得最大索引。