在Pyspark数据框中检查重复项

15

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

我想检查数据帧是否根据某些列具有重复项,如果有,就会失败该过程。

TIA。


您可能会发现此答案中的方法对于问题Count number of duplicate rows in SPARKSQL也很有帮助。 - pault
6个回答

32

如果您也想实际检查重复项,可以执行

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

2
很不幸,这只显示了第一个重复项之后的副本。例如,如果我想要标记具有列(或列列表)上重复值的所有数据,则会错过第一个实例。:( - Mike Williamson

24

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

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

谢谢 - 我想到了这个,但我在想这是否是最简单的方法,或者我错过了一个酷炫的技巧。 - Prasanna Saraswathi Krishnan
不,我想象不出会有类似“hasDuplicates”功能的东西。您可以创建一个临时表,并执行类似于“spark.sql('select count(*) - count(distinct col) from temp_view')”这样的操作。这肯定不是一种更简单的方法,但它可能(或可能不)具有更好的性能。 - David
通过这种方法,我们只能检查计数,那数据怎么办?让我解释一下:在df1列c1[1,2,3,4,5]中,另一个df2列c2[1,1,2,3,4,5]。你将如何验证数据是否重复? - user9518134
不确定你想要做什么,但是似乎joinsubtract方法可能会有所帮助。 - David
两个最佳答案之间的最快方法是什么? - Michel Hua

8

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

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

3

要获取具有重复行的pyspark dataframe,可以使用以下代码:

df_duplicates = df.groupBy(df.columns).count().filter("count > 1")

2

您可以对一组列进行去重,计算不同行的数量,并将其与总行数进行比较。如果它们相同,则没有重复行。如果不同行的数量小于总行数,则存在重复项。

df.select(list_of_columns).distinct().count()df.select(list_of_columns).count()


0

调用count()两次是不必要的,可以通过单个操作获得这两个计数。

from pyspark.sql import functions as F

cols = ['col1', 'col2', 'col3']

counts_df = df.select([
    F.countDistinct(*cols).alias('n_unique'),
    F.count('*').alias('n_rows')
])
n_unique, n_rows = counts_df.collect()[0]

现在可以使用n_uniquen_rows记录重复/唯一百分比,也可以记录失败的过程等。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接