检查 Pyspark Dataframe 中的重复项

Posted

技术标签:

【中文标题】检查 Pyspark Dataframe 中的重复项【英文标题】:check for duplicates in Pyspark Dataframe 【发布时间】:2018-05-01 19:55:16 【问题描述】:

有没有一种简单而有效的方法来检查 python 数据帧中的重复项(而不是删除它们)?

我想根据列的组合检查数据框是否有重复,如果有,则使该过程失败。

TIA。

【问题讨论】:

您还可以在this answer 中找到解决问题Count number of duplicate rows in SPARKSQL 的方法很有帮助。 【参考方案1】:

如果您还想实际检查重复项,您可以这样做

df \
    .groupby(['column1', 'column2']) \
    .count() \
    .where('count > 1') \
    .sort('count', ascending=False) \
    .show()

【讨论】:

不幸的是,这仅显示第一个之外的重复项。例如,如果我想在列(或列列表)上标记所有具有重复值的数据,那么这将错过第一个实例。 :(【参考方案2】:

最简单的方法是检查数据框中的行数是否等于删除重复项后的行数。

if df.count() > df.dropDuplicates([listOfColumns]).count():
    raise ValueError('Data has duplicates')

【讨论】:

谢谢 - 我想到了这一点,想知道这是最简单的方法还是我错过了一个很酷的技巧。 不,我无法想象会有某种hasDuplicates 功能。您可以创建一个临时表并执行类似spark.sql('select count(*) - count(distinct col) from temp_view') 的操作。这当然不是一种更简单的方法,但它可能(也可能不会)有更好的性能 这种方法只能查count,那data呢?让我详细说明一下:在 df1 列 c1[1,2,3,4,5] 中,另一个 df2 列 c2[1,1,2,3,4,5]。您将如何验证数据是否重复 不确定您到底想做什么,但听起来joinsubtract 方法可能会有所帮助。【参考方案3】:

检查重复项的另一种方法是:

df.exceptAll(df.dropDuplicates([listOfColumns]))

【讨论】:

以上是关于检查 Pyspark Dataframe 中的重复项的主要内容,如果未能解决你的问题,请参考以下文章

具有聚合唯一值的pyspark dataframe groupby [重复]

批量从Dataframe插入到DB,忽略Pyspark中的失败行

Pyspark:检查数组类型列是不是包含列表中的值[重复]

如何检查 Pyspark Dataframe 中是不是存在列表交集

基于pyspark中仅一列的两个DataFrame之间的差异[重复]

如何快速检查 PySpark Dataframe 中是不是存在行?