scala – GroupByKey在Spark中是否保留原来的顺序?
在Spark中,groupByKey功能将(K,V)对RDD转换为(K,Iterable V)对RDD.
但是,这个功能是否稳定?即从原始顺序保留的迭代中的顺序? 例如,如果我最初读了一个形式的文件: K1;V11 K2;V21 K1;V12 可能我对K1的迭代是(V12,V11)(因此不保留原始顺序),或者只能是(V11,V12)(从而保留原始顺序)? 解决方法
不,订单不保存.火花壳中的示例:
scala> sc.parallelize(Seq(0->1,0->2),2).groupByKey.collect res0: Array[(Int,Iterable[Int])] = Array((0,ArrayBuffer(2,1))) 顺序是时间依赖的,所以它可以在运行之间变化. (我的下一个运行中我有相反的顺序) 这里发生了什么? groupByKey通过使用HashPartitioner重新分区RDD,从而将一个密钥的所有值都结束在同一个分区中.然后它在每个分区上本地执行聚合. 重新分区也被称为“随机播放”,因为RDD的行在节点之间重新分配.随机文件从其他节点并行拉出.新的分区是按照它们到达的顺序构建的.来自最慢源的数据将位于新分区的末尾,并在groupByKey的列表末尾. (从工作人员自己获取的数据当然是最快的,因为这里没有网络传输,这个数据被同步拉出,从而达到这个目的(至少这样看来)所以要复制我的实验,你需要至少2名Spark工作人员) 资料来源:http://apache-spark-user-list.1001560.n3.nabble.com/Is-shuffle-quot-stable-quot-td7628.html (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |