我有两个数据帧
val a = Map(1 -> 2, 3 -> 5).toSeq.toDF("key", "value")
val b = Map(1 -> 4, 2 -> 5).toSeq.toDF("key", "value")
我在key
a.join(b, "key").show(false)
+---+-----+-----+
|key|value|value|
+---+-----+-----+
|1 |2 |4 |
+---+-----+-----+
我想要的结果是
+---+-----+
|key|value|
+---+-----+
|1 |{2, 4}
+---+-----
我希望列value
是一个汇总值的数组。有什么习惯用法吗?默认情况下,2个rdd上的join
会执行此操作。
要使用全类型路由,您可以使用Dataset路由:
case class MyKeyValuePair(key: String, value: String)
case class MyOutput(key: String, values: Seq[String])
val a = Map(1 -> 2, 3 -> 5).toSeq.toDF("key", "value").as[MyKeyValuePair]
val b = Map(1 -> 4, 2 -> 5).toSeq.toDF("key", "value").as[MyKeyValuePair]
val output = a.joinWith(b, a("key") === b("key"), "inner").map{
case ( pair1, pair2 ) => MyOutput(pair1.key, Seq(pair1.value, pair2.value))
}
output.show
+---+------+
|key|values|
+---+------+
| 1|[2, 4]|
+---+------+
这使您可以细粒度地控制输出的确切外观,并提供编译时安全性。你只需要定义一些case类来输入你的数据集。
希望这对你有帮助!