首页 > 解决方案 > 当 .agg.count() 中没有行时显示 0

问题描述

我有一些像这样汇总的数据:

count = (
    t1
    .where(sf.col('status') == 'i')
    .select('name',
            'id',
            'prod',
            'date')
    .groupby('name',
            'id',
            'date'
    .agg(
        sf.count('prod').alias('count')
    )

这工作正常,但我也希望看到count= 0 的行account没有带有status = i. 有没有一种方法可以有条件地聚合,类似于这个?

count = (
    t1
    .select('name',
            'id',
            'prod',
            'status',
            'date')
    .groupby('name',
            'id',
            'date'
    .agg(
        if no rows with status = i, 0
        else sf.count('prod').alias('count')
    )

标签: apache-sparkpysparkapache-spark-sqlconditional-statements

解决方案


您可以尝试使用when语句进行条件计数:

count = (
    t1
    .select('name',
            'id',
            'prod',
            'date',
            'status')
    .groupby('name',
            'id',
            'date'
    .agg(
        sf.count(
            sf.when(sf.col('status') == 'i', sf.col('prod'))
        ).alias('count')
    )
)

但是如果每个组可以包含不同的状态,下面的代码可能会给出不同的结果:

count = (
    t1
    .select('name',
            'id',
            'prod',
            'date',
            'status')
    .groupby('name',
            'id',
            'date'
    .agg(
        sf.when(~sf.max(sf.col('status') == 'i'), 0)
          .otherwise(sf.count('prod'))
          .alias('count')
    )
)

推荐阅读