簡體   English   中英

提取RDD中的列表元素

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM