提取rdd中列表的元素

yhuiod9q  于 2021-05-27  发布在  Spark
关注(0)|答案(1)|浏览(623)

我想要达到的目标

我在和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 去实现我想要实现的目标?

mklgxw1f

mklgxw1f1#

您可以简单地用 ++ 操作员:

val res: RDD[List[String]] = rdd1.join(rdd2)
  .map { case (_, (list1, list2)) => list1 ++ list2 }

可能是一个更好的方法,可以避免携带 List[String] 这可能是非常大的,将rdd分解成更小的(键值)对,连接它们,然后执行 groupByKey :

val flatten1: RDD[(String, String)] = rdd1.flatMapValues(identity)
val flatten2: RDD[(String, String)] = rdd2.flatMapValues(identity)
val res: RDD[Iterable[String]] = (flatten1 ++ flatten2).groupByKey.values

相关问题