gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 04:35:48 26 4
gpt4 key购买 nike

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

两个Dataset中都有一条记录PhoneNumber为common,但该记录中的其他列不同

我在这两个数据集上运行以下 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 查询,旨在删除重复项,但它也需要知道主键,根据它决定什么是重复的。

此查询如何推断我的数据集的“主键”? (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]

How does this query infer the "Primary key" of my Dataset?



我没有,或者至少在当前版本中没有。它只适用 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]

关于apache-spark - Spark SQL 查询中的联合从数据集中删除重复项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46372740/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com