我想要达到的目标
我在和spark和scala合作。我有两对RDD。
rdd1 : RDD[(String, List[String])]
rdd2 : RDD[(String, List[String])]
两个RDD在其第一个值上联接。
val joinedRdd = rdd1.join(rdd2)
所以产生的rdd是 RDD[(String, (List[String], List[String]))]
. 我想Map这个rdd并提取两个列表的元素,这样得到的rdd就只包含两个列表的这些元素。
示例
rdd1 (id, List(a, b))
rdd2 (id, List(d, e, f))
wantedResult (a, b, d, e, f)
天真的方法
我天真的方法是直接用 (i)
,如下所示:
val rdd = rdd1.join(rdd2)
.map({ case (id, lists) =>
(lists._1(0), lists._1(1), lists._2(0), lists._2(2), lists._2(3)) })
/* results in RDD[(String, String, String, String, String)] */
有没有一种方法可以获取每个列表中的元素,而不单独处理每个元素?类似于 lists._1.extractAll
". 有没有办法使用 flatMap
去实现我想要实现的目标?
1条答案
按热度按时间mklgxw1f1#
您可以简单地用
++
操作员:可能是一个更好的方法,可以避免携带
List[String]
这可能是非常大的,将rdd分解成更小的(键值)对,连接它们,然后执行groupByKey
: