如何以类似于RDD的方式连接2个数据集?



我有两个数据帧

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类来输入你的数据集。

希望这对你有帮助!

最新更新