spark sql查询中的联合从数据集中删除重复项



我正在使用java api用于apache spark,我有两个数据集a&B这两者的架构都是相同的:声音,名称,年龄,地址

在两个数据集中都有一个记录,它们具有常见的声音,但此记录中的其他列是不同的

我在这两个数据集上按照SQL查询进行运行(通过将这些记录为临时表):

A.createOrReplaceTempView("A");
B.createOrReplaceTempView("B");
String query = "Select * from A UNION Select * from B";
Dataset<Row> result = sparkSession.sql(query);
result.show();

出乎意料的是,结果只有一个记录,并删除了另一个记录。

我知道联盟是SQL查询旨在删除重复项,但随后还需要了解主要键,以决定重复的内容。

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

您可以使用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
== Physical Plan ==
Union
:- LocalTableScan [_1#152L, _2#153]
+- LocalTableScan [_1#170L, _2#171]

Dataset.union方法:

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

该查询如何推断我的数据集的"主键"?

i没有,或者至少在当前版本中。它仅使用所有可用列应用HashAggregate

spark.sql("SELECT * FROM a UNION SELECT * FROM b").explain
== 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]

相关内容

  • 没有找到相关文章

最新更新