当前位置:  开发笔记 > 大数据 > 正文

如何在保留顺序的同时将RDD的内容替换为另一个?

如何解决《如何在保留顺序的同时将RDD的内容替换为另一个?》经验,为你挑选了1个好方法。

我有两个RDD,一个(a, b, a, c, b, c, a)和另一个 - 配对的RDD ((a, 0), (b, 1), (c, 2)).

我想分别用0,1,2(分别是第二个RDD中的键a,b,c的值)替换a第一个RDD中的s,bs和cs.我想在第一个RDD中保留事件的顺序.

如何在Spark中实现它?



1> zero323..:

例如这样:

val rdd1 = sc.parallelize(Seq("a", "b", "a", "c", "b", "c", "a"))
val rdd2 = sc.parallelize(Seq(("a", 0), ("b", 1), ("c", 2)))

rdd1
  .map((_, 1)) // Map first to PairwiseRDD with dummy values
  .join(rdd2)
  .map { case (_, (_, x)) => x } // Drop keys and dummy values

如果映射RDD很小,它可以更快broadcastmap:

val bd = sc.broadcast(rdd2.collectAsMap)
// This assumes all values are present. If not use get / getOrElse
// or map withDefault
rdd1.map(bd.value) 

它还将保留元素的顺序.

如果join您可以添加增加的标识符(zipWithIndex/ zipWithUniqueId)以便能够恢复初始订购,但它实际上更昂贵.

推荐阅读
大大炮
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有