如果我們有以下鍵值對:星火找到鍵/值對與關鍵等於其他值,並加入
[T,V] [V,W] [A,B] [B,C]
我需要結果爲
[T,V] [V,W] [T,W] [A,B] [B,C] [A,C]
所以基本上產生[T,W]和[V,W],並附加到現有的集合
我不知道如何在spark中使用scala執行此操作,請幫助。
如果我們有以下鍵值對:星火找到鍵/值對與關鍵等於其他值,並加入
[T,V] [V,W] [A,B] [B,C]
我需要結果爲
[T,V] [V,W] [T,W] [A,B] [B,C] [A,C]
所以基本上產生[T,W]和[V,W],並附加到現有的集合
我不知道如何在spark中使用scala執行此操作,請幫助。
使用純粹的Scala集合函數(在Set) - 我不使用星火:
val ex = Set("T" -> "V", "V" -> "W", "A" -> "B", "B" -> "C")
val keysEquallingValues = ex.flatMap { tuple =>
ex.find(t => tuple._2 == t._1).map(t => tuple -> t)
}
val r = ex ++ keysEquallingValues.map(pair => pair._1._1 -> pair._2._2)
說明:
ex
就是你們的榜樣輸入Set
我們flatMap
過它使用返回Option[((String,String), (String, String))]
的表達式 - 即如果條件是否有一個與當前值相同的鍵?是真的,我們將有一個Some
包含滿足條件的兩個元組(!)的元組。
使用flatMap
和Option
這樣我們可以刪除不匹配的情況(如filter
),但同時也可以在一次傳遞中同時轉換集合的內容。
最後我們挑選第一個元組的關鍵字和第二個元組的值,以獲得所需的組合,並將其添加到您的原始Set
。
val df = sc.parallelize(
Array(("T","V"),("V","W"),("A","B"),("B","C"))
).toDF("key","value")
df.show
+---+-----+
|key|value|
+---+-----+
| T| V|
| V| W|
| A| B|
| B| C|
+---+-----+
df.join(
df.toDF("keyR", "valueR"),
$"value" === $"keyR"
).explode($"key",$"value",$"keyR",$"valueR"){row => Seq(
(row.getString(0), row.getString(1)),
(row.getString(2), row.getString(3)),
(row.getString(0), row.getString(3))
)}.select($"_1" as "key", $"_2" as "value").show
+---+-----+
|key|value|
+---+-----+
| A| B|
| B| C|
| A| C|
| T| V|
| V| W|
| T| W|
+---+-----+