Spark SQL查询中的联合从数据集中删除重复项

时间:2017-09-22 20:27:24

标签: apache-spark apache-spark-sql

我正在为Apache Spark使用Java API,我有两个数据集A& B. 这两者的架构是相同的:PhoneNumber,Name,Age,Address

数据集中有一条记录将PhoneNumber作为常用记录,但此记录中的其他列不同

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

// Visual Studio
error C2662: 'void Ali::String::View::swap(Ali::String::View &) noexcept': cannot convert 'this' pointer from 'const Ali::String::View' to 'Ali::String::View &'

// g++
error: passing 'const Ali::String::View' as 'this' argument discards qualifiers [-fpermissive]

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

我知道UNION是SQL查询旨在删除重复项,但是它还需要知道主键,在此基础上它决定什么是重复。

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

1 个答案:

答案 0 :(得分:1)

您可以使用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]
  

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

我没有,或者至少不在当前版本中。它只是使用所有可用列来应用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]