如果我们有以下键值对:
[T,V] [V,W] [A,B] [B,C]
我需要结果
[T,V] [V,W] [T,W] [A,B] [B,C] [A,C]
所以基本上从[T,V]和[V,W]生成[T,W]并附加到现有集合
我不知道如何用scala来解决这个问题,请帮忙。
答案 0 :(得分: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|
+---+-----+
答案 1 :(得分:1)
使用纯粹的Scala集合函数(在Set中) - 我不使用Spark:
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
),同时也可以在一次传递中同时转换集合的内容。< / p>
最后,我们挑选第一个元组的键和第二个元组的值,以获得所需的组合,并将其添加到原始Set
。