【问题标题】:Pyspark retain only distinct (drop all duplicates)Pyspark 只保留不同的(删除所有重复项)
【发布时间】:2018-12-21 16:36:13
【问题描述】:

加入两个数据框(有自己的 ID)后,我有一些重复(来自两个来源的重复 ID) 我想删除任一 ID 上重复的 所有 行(因此不保留一个重复的出现)

我可以按第一个 ID 进行分组,对 count ==1 进行计数和过滤,然后对第二个 ID 重复该操作,然后将这些输出内部连接回原始连接的数据帧 - 但这感觉有点长。

有没有像 dropDuplicates() 这样更简单的方法,但没有留下任何重复项?

我看到 pandas 可以选择不保留第一个重复项 df.drop_duplicates(subset=['A', 'C'], keep=False)

【问题讨论】:

  • window_df1 = Window.partitionBy("ID1") 和 window_df2 = Window.partitionBy("ID2") 然后我可以在窗口上添加两个 ID 计数的列。然后过滤到仅计数为 1。partitionBy 使用几乎唯一的值会效率低下吗?

标签: join pyspark duplicates


【解决方案1】:

dropDuplicates()

据官方documentation.

返回一个删除重复行的新 DataFrame,仅可选 考虑某些列。

考虑所有列删除重复项:

df.dropDuplicates()

如果想从某个列中删除重复项

df.dropDuplicate(subset=col_name)

对于多列:

df.dropDuplicates(subset=[col_name1, col_name2])

编辑评论

df =  df.agg(criteria_col).agg(sum(lit(1)).alias('freq'))

df = df.filter(col('freq')=1)

【讨论】:

  • 我使用过 df.dropDuplicate(subset=col_name) 但我相信这会保留重复项集中的第一个行。我希望加入后的数据框仅包含贡献数据框的 ID 之间的 1-1 链接
猜你喜欢
  • 1970-01-01
  • 2019-09-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-30
  • 2016-12-28
  • 2020-01-18
  • 1970-01-01
相关资源
最近更新 更多