【问题标题】:Remove duplicates from Spark SQL joining two dataframes从连接两个数据帧的 Spark SQL 中删除重复项
【发布时间】:2020-08-11 18:55:38
【问题描述】:

我有两个 spark DF 需要加入。仅从 df2 中选择 df1 中存在的值,不应重复行。

例如:

df1:

+-------------+---------------+----------+
|a            |b              |val       |
+-------------+---------------+----------+
| 202003101750|   202003101700|1712384842|
| 202003101740|   202003101700|1590554927|
| 202003101730|   202003101700|1930860788|
| 202003101730|   202003101600|    101713|
| 202003101720|   202003101700|1261542412|
| 202003101720|   202003101600|   1824155|
| 202003101710|   202003101700| 912601761|
+-------------+---------------+----------+

df2:

+-------------+---------------+
|a            |b              |
+-------------+---------------+
| 202003101800|   202003101700|
| 202003101800|   202003101700|
| 202003101750|   202003101700|
| 202003101750|   202003101700|
| 202003101750|   202003101700|
| 202003101750|   202003101700|
| 202003101740|   202003101700|
| 202003101740|   202003101700|
+-------------+---------------+

我正在做以下事情:

df1.join(df2, Seq("a", "b"), "leftouter").where(col("val").isNotNull) 但是我的输出有几个重复的行。

+-------------+---------------+----------+
|a            |b              |val       |
+-------------+---------------+----------+
| 202003101750|   202003101700|1712384842|
| 202003101750|   202003101700|1712384842|
| 202003101750|   202003101700|1712384842|
| 202003101750|   202003101700|1712384842|
| 202003101740|   202003101700|1590554927|
| 202003101740|   202003101700|1590554927|
| 202003101740|   202003101700|1590554927|
| 202003101740|   202003101700|1590554927||
+-------------+---------------+----------+

如果从 df1 中删除 val,我正在尝试实现类似操作。但是except 似乎不起作用。 例如以下是所需的操作 df1.drop(col("val")).except("df2") df1 的架构如下:

root
 |-- a: String (nullable = true)
 |-- b: String (nullable = true)
 |-- val: long (nullable = true)

另外,left-outer join和except之间到底有什么区别? 预期输出:

+-------------+---------------+----------+
|a            |b              |val       |
+-------------+---------------+----------+
| 202003101750|   202003101700|1712384842|
| 202003101740|   202003101700|1590554927||
+-------------+---------------+----------+

【问题讨论】:

  • 请添加您的预期输出..?
  • @Shu 添加了评论。你能看一下吗?

标签: scala apache-spark apache-spark-sql


【解决方案1】:

您可以使用函数dropDuplicates(),删除所有重复的行:

uniqueDF = df.dropDuplicates()

或者您可以指定要匹配的列:

uniqueDF = df.dropDuplicates("a","b")

【讨论】:

  • 使用“left_semi”或left_anti --join方法
【解决方案2】:

LeftOuter join 将获取左表中的所有行和右表中的匹配行。

Except 将给出与第一个数据帧相比在第二个数据帧中不存在的行(没有重复)。

对于您的情况,您可以使用 inner(或)outer 加入 dropDuplicates。

df1.join(df2, Seq("a", "b"), "inner").dropDuplicates().show()
//+------------+------------+----------+
//|           a|           b|       val|
//+------------+------------+----------+
//|202003101740|202003101700|1590554927|
//|202003101750|202003101700|1712384842|
//+------------+------------+----------+

df1.join(df2, Seq("a", "b"), "rightouter").where(col("val").isNotNull).dropDuplicates().show()
//+------------+------------+----------+
//|           a|           b|       val|
//+------------+------------+----------+
//|202003101740|202003101700|1590554927|
//|202003101750|202003101700|1712384842|
//+------------+------------+----------+

【讨论】:

  • dropDuplicates 和 distinct 是同一个操作吗? @舒
  • @coderWorld,存在一个区别distinct 将适用于整个数据帧,但dropDuplicates 我们可以在specific column 上删除重复项(或)整个dataframe也!
猜你喜欢
  • 1970-01-01
  • 2019-06-22
  • 1970-01-01
  • 1970-01-01
  • 2013-01-14
  • 2012-07-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多