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
相关产品推荐
相关产品推荐

