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

Spark:移除具有不同值的重复行,但仅保留一个有区别的行

左丘子平
2023-03-14
ds.show():

id1 | id2 | id3 | value  |
1   | 1   | 2   | tom    |
1   | 1   | 2   | tim    |
1   | 3   | 2   | tom    |
1   | 3   | 2   | tom    |
2   | 1   | 2   | mary   |
id1 | id2 | id3 | value  |
1   | 3   | 2   | tom    |
2   | 1   | 2   | mary   |
val df = Seq(
  (1, 1, 2, "tom"),
  (1, 1, 2, "tim"),
  (1, 3, 2, "tom"),
  (1, 3, 2, "tom"),
  (2, 1, 2, "mary")
).toDF("id1", "id2", "id3", "value")

val window = Window.partitionBy("id1", "id2", "id3")

df.withColumn("count", count("value").over(window))
  .filter($"count" < 2)
  .drop("count")
  .show(false)

但是它并不像预期的那样工作,因为它将删除所有重复的行。

我想这样做的原因是与另一个数据集联接,而不是在同一个键组有多个名称时从该数据集添加信息

共有1个答案

姜志行
2023-03-14

您可以在分组前删除重复项,这将给出如下所示的单个记录

df.dropDuplicates()
  .withColumn("count", count("value").over(window))
  .filter($"count" < 2)
  .drop("count")
  .show(false)

您还可以将要检查重复的字段指定为

df.dropDuplicates("id1", "id2", "id3", "value")
  .withColumn("count", count("value").over(window))
  .filter($"count" < 2)
  .drop("count")
  .show(false)

产出:

+---+---+---+-----+
|id1|id2|id3|value|
+---+---+---+-----+
|1  |3  |2  |tom  |
|2  |1  |2  |mary |
+---+---+---+-----+
 类似资料:
  • 我有一个数据集,如下所示:

  • 我有一个数据帧重复行除了一个值。我想过滤掉它们,只保留值较高的行。 等等。 因此,例如,需要比较具有skill_a和相同User_ID的行,并且只保留具有最近一年的行。 仅按用户ID提供组的行数。 只给了我一个系列,我无法合并回df。 反对的想法? 谢谢你

  • 我有一个包含17列(A列到S列)的excel工作表。A列包含ID号,C列是日期列,F列包含时间格式的值(hh: mm)。对于同一个日期/天,一些ID号在F列中包含两个值-通常是一个高数字(多小时和分钟)和一个低数字(几分钟)。如果有这样的重复,我希望从工作表中删除包含F列中低值的整行。 我尝试了Excel的“板载”删除重复项功能,但没有成功。然后我遇到了这段VBA代码,它删除了包含最高值的整个重复

  • 问题内容: 我必须清理具有重复行的表: 一个可能具有多个值: 我想对整个表执行一个查询,并删除和重复的所有行。在上面的示例中,删除后,我只想剩下1、2、4和5。 问题答案: ;WITH x AS ( SELECT id, gid, url, rn = ROW_NUMBER() OVER (PARTITION BY gid, url ORDER BY id) FROM dbo.table ) SEL

  • 我有一个简单的数据库表 我想删除所有按fv和sv分组的重复行。这已经是一个相当流行的问题,有很好的答案。但我需要改变这种情况。当rel\u id为NULL时,我想保留该行。在任何其他情况下,任何事情都会发生。 所以通过使用以下值 任何一个 或 将是有效的结果。其中为 不会。因为第一个条目有作为,它在之上担任主席。 我目前有这个(这是关于基本重复问题的答案)作为删除重复项的查询,但我不确定如何继续修

  • 我想通过删除所有具有相同值的行,但无法获取。