Spark查找键/值对,键等于其他值并加入

时间:2016-03-23 02:06:40

标签: scala apache-spark

如果我们有以下键值对:

[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来解决这个问题,请帮忙。

2 个答案:

答案 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包含满足条件的两个元组(!)的元组。

使用flatMapOption这样可以让我们删除不匹配的情况(例如filter),同时也可以在一次传递中同时转换集合的内容。< / p>

最后,我们挑选第一个元组的键和第二个元组的值,以获得所需的组合,并将其添加到原始Set