当前位置: 首页 > 知识库问答 >
问题:

从连接两个数据帧的Spark SQL中删除重复项

艾凯捷
2023-03-14

我有两个火花DF,我需要加入。只选择df1中存在的df2中的值,不应该有重复的行。

例如:

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"). Anywhere("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||
+-------------+---------------+----------+

如果val从df1中删除,我试图实现一个类似except的操作。但是除了之外,似乎不起作用。例如,以下是所需的操作df1。下降(col(“val”))。除了(“df2”)之外,df1的模式如下:

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

另外,左外连接和except之间到底有什么区别?预期产出:

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

共有2个答案

巫晋鹏
2023-03-14

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

uniqueDF = df.dropDuplicates()

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

uniqueDF = df.dropDuplicates("a","b")
韩寂离
2023-03-14

左外连接将从左表获取所有行,从右表获取匹配行。

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

对于您的情况,您可以使用内部(或)外部与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|
//+------------+------------+----------+
 类似资料:
  • 我试图通过2列连接2个pyspark数据帧,数据帧是: DF1: df2: 我想得到下面的数据帧: 我试过了: 这会让我: 然后我使用以下方法消除重复项: 有没有更好的方法? 我尝试了其他连接(左连接、内连接等。),但不会得到我想要的结果 还有,有没有更好的方法来消除重复行?

  • 我有一个这样的专栏: 我希望专栏看起来像这样: 只希望保留重复记录的第一个或最后一个。 目前,我使用的是: 但它不起作用。我错过了什么吗?

  • 假设我有两个数据帧,具有不同级别的信息,如下所示: 我想加入df1和df2,并将“值”信息传递给df2:一天中的每一小时都将获得“日”值。 预期产出:

  • 我有2个数据帧,和,有一个列(和其他非重要的)。 我想在中删除包含已在中的电子邮件的行。 我该怎么做?

  • 我想从两个表中删除相关的行。可能有外键,也可能没有。因此,可以肯定的是,我不想依赖外键及其在DELETE上的

  • 我试图在包含重复索引的两个数据帧上使用pandas concat。 当我尝试连接我的两个数据帧时,我得到以下错误 传递值的形状是(12, 180054),指数暗示(12,10000)。 为了更好地理解这个问题,我创建了两个数据帧: 看起来像: 和 看起来像: 这与我的原始数据帧也有类似的方面。索引是重复的,并且是日期时间格式。 但是,concat(axis=1)可以很好地创建以下数据帧 (这正是我