2017-09-22 35 views
1

我使用的Java API的Apache星火删除重复的,我有两个数据集& B. 这些两个模式是相同的:******中国,姓名,年龄,地址联盟星火SQL查询从数据集

有两个有******中国作为共同的数据集一个纪录,但这一纪录其他列不同

我运行下面这两个数据集的SQL查询(通过注册这些临时表):

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

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

Dataset<Row> result = sparkSession.sql(query); 
result.show(); 

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

我知道UNION是SQL查询的目的是删除重复,但它然后还需要知道主密钥的基础上,它决定什么是重复的。

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

回答

0

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

如何做到这一点查询推断我的数据集的“主键”?

我没有,或者至少没有在当前版本。

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] 
:它只是使用所有可用的列适用 HashAggregate