You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 05:20:04