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

PySpark中.distinct()与countDistinct()的结果差异及原因咨询

为什么PySpark的.distinct()和countDistinct()会出现结果差异?

这完全是预期行为,核心差异来自两者对NULL值的处理逻辑不同,下面结合你的示例详细解释:

1. .distinct()的行为

.distinct()是对DataFrame的整行进行去重判断,它会将NULL视为一个有效的“值”——也就是说,只要两行的所有列值(包括NULL)完全一致,才会被视为重复项。

在你的示例数据中,第三行的degree是NULL,对应的组合是(NULL, "School of Information"),这个组合在数据中只出现一次,所以.distinct()会保留它。最终返回的4行分别是:

  • ("Masters", "School of Information")
  • ("Masters", "EECS")
  • (NULL, "School of Information")
  • ("Ph.D.", "EECS")

2. countDistinct(col1, col2)的行为

当你调用countDistinct("degree", "department")时,这个函数等价于SQL中的COUNT(DISTINCT degree, department),它的规则是:只有当所有传入的列都不为NULL时,这个列组合才会被计入统计。如果任何一列是NULL,该组合会被直接排除在计数之外。

你的示例中,第三行的degree是NULL,所以这个组合不会被统计。剩下的三个非NULL组合都是唯一的,因此最终返回的计数是3。

验证与补充

如果你想让countDistinct的结果和.distinct().count()一致,可以改用countDistinct(struct("degree", "department")),这样会将两个列的组合视为一个整体,NULL也会被当作有效部分计入统计。示例代码:

from pyspark.sql.functions import struct, countDistinct

graduateProgram.select(countDistinct(struct("degree", "department"))).show()

这个查询会返回4,和.distinct().count()的结果完全匹配。

内容的提问来源于stack exchange,提问作者ZK Zhao

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 04:22:06