PySpark DataFrame.dropDuplicates()未完全去重问题求助
问题根源:你混淆了
data6和date6的列值! 仔细看你的原始DataFrame,你提到的"date6和z"的行其实分为两组完全独立的记录:
- 一组是
column1=data6+column4=z(第一行) - 另一组是
column1=date6+column4=z(第八行和第十行)
这两组的column1值是完全不同的字符串(一个是data6,一个是date6,差了一个字母t),所以dropDuplicates(pk)不会把它们判定为重复项——毕竟你指定的去重键是column1和column4,这两组的键值组合根本不一样。
而你看到的"date6和z"的重复行仅被去除一行,这其实是完全符合预期的行为:原始里有两行date6+z的记录(dml_operation分别是2和0),去重后自然只会保留其中一行(Spark会保留重复组中的任意一行,具体哪一行取决于分区和执行计划,不保证顺序)。
再看你提到的"data8和x"的情况:原始里有两行column1=data8 + column4=x的记录,去重后只留一行,这和date6+z的处理逻辑完全一致,没有问题。
验证方法
你可以单独筛选这几个行确认差异:
# 筛选data6+z的行 df_new.filter((df_new.column1 == 'data6') & (df_new.column4 == 'z')).show() # 筛选date6+z的行 df_new.filter((df_new.column1 == 'date6') & (df_new.column4 == 'z')).show()
运行后你会清晰看到这是两个独立的分组,所以dropDuplicates的结果完全正确。
额外说明
如果你的实际需求是把data6和date6视为相同值去重,那需要先对column1做清洗(比如修正拼写错误),再执行去重:
from pyspark.sql.functions import regexp_replace # 把date6替换成data6,或者根据需求反过来 df_clean = df_new.withColumn('column1', regexp_replace('column1', 'date6', 'data6')) df_clean.dropDuplicates(pk).show()
内容的提问来源于stack exchange,提问作者nojohnny101
相关产品推荐
相关产品推荐

