联合不会删除火花数据框中的重复行

Ath*_*kur 3 scala apache-spark apache-spark-sql

我有两个如下所示的数据框

+--------------------+--------+-----------+-------------+
|UniqueFundamentalSet|Taxonomy|FFAction|!||DataPartition|
+--------------------+--------+-----------+-------------+
|192730241374        |1       |I|!|       |Japan        |
|192730241374        |2       |I|!|       |Japan        |
|192730241373        |1       |I|!|       |Japan        |
|192730241373        |2       |I|!|       |Japan        |
+--------------------+--------+-----------+-------------+

+--------------------+--------+-----------+-------------+
|UniqueFundamentalSet|Taxonomy|FFAction|!||DataPartition|
+--------------------+--------+-----------+-------------+
|192730241374        |1       |I|!|       |Japan        |
|192730241374        |2       |I|!|       |Japan        |
|192730391384        |1       |I|!|       |Japan        |
|192730391384        |2       |I|!|       |Japan        |
|192730241373        |1       |I|!|       |Japan        |
|192730241373        |2       |I|!|       |Japan        |
+--------------------+--------+-----------+-------------+
Run Code Online (Sandbox Code Playgroud)

当我在上述数据框之间执行联合时,我得到重复的行。这是我的输出

+--------------------+--------+-----------+-------------+
|UniqueFundamentalSet|Taxonomy|FFAction|!||DataPartition|
+--------------------+--------+-----------+-------------+
|192730241374        |1       |I|!|       |Japan        |
|192730241374        |2       |I|!|       |Japan        |
|192730241373        |1       |I|!|       |Japan        |
|192730241373        |2       |I|!|       |Japan        |
|192730241374        |1       |I|!|       |Japan        |
|192730241374        |2       |I|!|       |Japan        |
|192730391384        |1       |I|!|       |Japan        |
|192730391384        |2       |I|!|       |Japan        |
|192730241373        |1       |I|!|       |Japan        |
|192730241373        |2       |I|!|       |Japan        |
+--------------------+--------+-----------+-------------+

val dfToSave = dfMainOutput.union(insertdf)
Run Code Online (Sandbox Code Playgroud)

我的印象是 union 删除了重复的行,而 unionall 保留了它。我必须在 union 之后使用 distinct 。有人可以解释一下。

小智 7

你的印象是错误的。如官方文档所述

返回一个新的 Dataset,它包含此 Dataset 和另一个 Dataset> 中的行的并集。

这相当于 SQL 中的 UNION ALL。要执行 SQL 样式的集合联合(对元素执行重复数据删除),请使用此函数后跟一个distinct.

同样作为 SQL 中的标准,此函数按位置(而不是按名称)解析列: