Java Spark SQL:合并和覆盖具有相同模式的数据集

问题描述 投票:0回答:1

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 时有用,但不会帮助我实现所需的覆盖功能。

在此先感谢您的帮助!

java apache-spark join apache-spark-sql
1个回答
0
投票

您可以使用“完整”连接从两个数据集中获取所有值,然后使用合并获取首选列值:

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|
+---------+--------+
© www.soinside.com 2019 - 2024. All rights reserved.