[英]Extract elements of lists in an RDD
我正在使用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]))]
。 我想映射此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
實現我要實現的目標?
您可以簡單地用++
運算符將兩個列表連接起來:
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.