Java 11 和 Spark SQL 2.13:3.3.2 在这里。请注意:我正在使用 Java API 并对 Java API 感兴趣,并希望得到 Java 答案,但我可以可能破译基于 Scala 的答案,并在必要时进行必要的 Scala 到 Java 的转换。但 Java 将不胜感激!
我有 2 个
Dataset<Row>
实例,它们都具有完全相同的架构(相同的列/标题,它们是相同的类型):
data set #1 (ds1)
===
fruit,quantity
--------------
apple,50
pear,12
orange,0
kiwi,104
data set #2 (ds2)
===
id,fruit,quantity
--------------
banana,50
pineapple,25
orange,5
blueberry,15
我想“merge”这两个
Dataset<Row>
,以便它们相互附加或连接,但如果它们的ds2
列匹配,则ds1
会覆盖fruit
中的任何值.所以 orange
在两个数据集中,但在 ds2
中它的数量是 5
,所以这应该是结果 Dataset<Row>
输出中的最终列表。所以换句话说,这个操作应该产生第三个数据集,如下所示:
data set #2 (ds2)
===
id,fruit,quantity
--------------
apple,50
pear,12
orange,5
kiwi,104
banana,50
pineapple,25
blueberry,15
行的顺序无关紧要,对我来说重要的是两个数据集中的水果列表都列在第三行,如果有匹配,
ds1
行更新(未插入) ds2
. 中的水果
我看了一下
Dataset#join
JavaDocs,但它们似乎只在您需要相当于 inner join
的 SQL 时有用,但不会帮助我实现所需的覆盖功能。
在此先感谢您的帮助!
您可以使用“完整”连接从两个数据集中获取所有值,然后使用合并获取首选列值:
ds2 = ds2.withColumnRenamed("fruit", "fruit2").withColumnRenamed("quantity", "quantity2");
ds1.join(ds2, ds1.col("fruit").equalTo(ds2.col("fruit2")), "full")
.withColumn("fruit", functions.coalesce(col("fruit"), col("fruit2")))
.withColumn("quantity", functions.coalesce(col("quantity2"), col("quantity")))
.drop("fruit2", "quantity2")
.show();
结果:
+---------+--------+
| fruit|quantity|
+---------+--------+
| kiwi| 104|
| orange| 5|
| apple| 50|
| pear| 12|
| banana| 50|
|pineapple| 25|
|blueberry| 15|
+---------+--------+