簡體   English   中英

根據scala中的鍵比較兩對RDD的值

[英]compare values of two pair of RDDs based on key in scala

有沒有辦法根據鍵比較 2 對RDDs的值。
例如:

RDD1: RDD[(Int, String)] = {(1, "ABC"), (2, "XYZ"), (3, "PQR")}
RDD2: RDD[(Int, String)] = {(5, "AAA"), (2, "XYZ"), (3, "LMN")}

我的任務是獲取值不同的兩個rdds中存在的鍵數。
連接為rdd提供了鍵23 但我希望最終輸出為3因為值不同

我嘗試了以下方法:

var diff = rdd1.join(rdd2).map{case(k,(s1,s2))=> if (s1!=s2) (k,s1)}

所以我可以得到差異的數量。 但它同時提供了鍵23 我想我需要其他條件來跳過匹配值。
誰能建議我如何達到預期的結果? (或使用任何不同的方法)。

使用collect ,它采用偏函數並刪除未定義偏函數的值。 然后,在 case 語句中包含“if”作為保護,而不是 case 結果表達式的一部分:

val diff = rdd1.join(rdd2).collect {
  case (k, (s1, s2)) if s1 != s2 => (k, s1)
}

這樣,部分函數將不會在s1 == s2定義,這將使collect過濾掉它們。

一個等效(但稍微不那么優雅)的解決方案將使用mapfilter - 單獨map將始終返回與輸入相同數量的記錄:

val diff = rdd1.join(rdd2).filter {
  case (k, (s1, s2)) => s1 != s2
}.map {
  case (k, (s1, s2)) => (k, s1)
}

使用leftInnerJoin到第一個 rdd 中存在的鍵並依靠它。

val diff = rdd1.leftOuterJoin(rdd2).count()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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