基于多列的CountDistinct():PySpark分组去重计数需求
嘿,我来帮你搞定这个PySpark的分组去重计数需求!
你的核心需求是:按cats字段分组,统计每个组里**letter和pet的唯一组合数量**——也就是说,只有当某条记录的letter和pet同时和组内另一条记录完全相同时,才会被视为重复,不重复计数。
这里有两种简洁的实现方式,你可以根据自己的场景选择:
方法1:直接用countDistinct统计组合数
这种方法最直接,一步到位:
from pyspark.sql.functions import countDistinct # 按cats分组,统计letter和pet的唯一组合数 result_df = df.groupBy("cats") \ .agg(countDistinct("letter", "pet").alias("unique_letter_pet_count"))
countDistinct("letter", "pet")会自动识别两列的组合唯一性,完美匹配你的需求——它不会单独对某一列去重,只会把letter和pet完全相同的记录算作重复。
方法2:先去重再分组计数
如果你后续还需要用到这些去重后的(cats, letter, pet)组合数据,可以先做去重操作,再分组统计:
# 第一步:去除(cats, letter, pet)的重复记录 unique_combinations = df.dropDuplicates(["cats", "letter", "pet"]) # 第二步:按cats分组,统计每组的记录数(也就是唯一组合数) result_df = unique_combinations.groupBy("cats") \ .count() \ .withColumnRenamed("count", "unique_letter_pet_count")
示例输出
针对你给出的DataFrame,最终结果会是这样:
| cats | unique_letter_pet_count |
|---|---|
| cat1 | 4 |
| cat2 | 2 |
解释一下:
cat1有4种唯一组合:(A, cat)、(A, dog)、(B, cat)、(B, dog)cat2有2种唯一组合:(B, cat)、(A, cat)
内容的提问来源于stack exchange,提问作者Norah Jones
相关产品推荐
相关产品推荐

