Spark SQL 查询中的 Union 删除数据集中的重复项

Ama*_*ana 5 apache-spark apache-spark-sql

我正在使用 Apache Spark 的 Java API,并且我有两个数据集 A 和 B。这两个数据集的架构是相同的:电话号码、姓名、年龄、地址

两个数据集中都有一条记录具有相同的 PhoneNumber,但该记录中的其他列不同

我对这两个数据集运行以下 SQL 查询(通过将它们注册为临时表):

A.createOrReplaceTempView("A");
B.createOrReplaceTempView("B");

String query = "Select * from A UNION Select * from B";

Dataset<Row> result = sparkSession.sql(query);
result.show();
Run Code Online (Sandbox Code Playgroud)

令人惊讶的是,结果只有一条具有相同 PhoneNumber 的记录,另一条记录被删除了。

我知道 UNION 是 SQL 查询,旨在删除重复项,但它还需要知道主键,并据此决定重复项。

此查询如何推断我的数据集的“主键”?(Spark中没有主键的概念)

zer*_*323 4

您可以使用UNION ALL

Seq((1L, "foo")).toDF.createOrReplaceTempView("a")
Seq((1L, "bar"), (1L, "foo")).toDF.createOrReplaceTempView("b")

spark.sql("SELECT * FROM a UNION ALL SELECT * FROM b").explain
Run Code Online (Sandbox Code Playgroud)
== Physical Plan ==
Union
:- LocalTableScan [_1#152L, _2#153]
+- LocalTableScan [_1#170L, _2#171]
Run Code Online (Sandbox Code Playgroud)

Dataset.union方法:

spark.table("a").union(spark.table("b")).explain
Run Code Online (Sandbox Code Playgroud)
== Physical Plan ==
Union
:- LocalTableScan [_1#152L, _2#153]
+- LocalTableScan [_1#170L, _2#171]
Run Code Online (Sandbox Code Playgroud)

此查询如何推断我的数据集的“主键”?

我没有,或者至少在当前版本中没有。它仅适用于HashAggregate使用所有可用的列:

spark.sql("SELECT * FROM a UNION SELECT * FROM b").explain
Run Code Online (Sandbox Code Playgroud)
== Physical Plan ==
*HashAggregate(keys=[_1#152L, _2#153], functions=[])
+- Exchange hashpartitioning(_1#152L, _2#153, 200)
   +- *HashAggregate(keys=[_1#152L, _2#153], functions=[])
      +- Union
         :- LocalTableScan [_1#152L, _2#153]
         +- LocalTableScan [_1#170L, _2#171]
Run Code Online (Sandbox Code Playgroud)