2016-03-23 55 views

回答

1

使用純粹的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包含滿足條件的兩個元組(!)的元組。

使用flatMapOption這樣我們可以刪除不匹配的情況(如filter),但同時也可以在一次傳遞中同時轉換集合的內容。

最後我們挑選第一個元組的關鍵字和第二個元組的值,以獲得所需的組合,並將其添加到您的原始Set

1
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| 
+---+-----+