如何计算分组Spark数据框中的布尔值

MYj*_*Yjx 13 python sql apache-spark apache-spark-sql pyspark

我想计算从分组的Spark数据帧的列中有多少记录是真的,但我不知道如何在python中这样做.例如,我有一个带有a的数据region,salary以及IsUnemployed带有IsUnemployed布尔值的列.我想看看每个地区有多少失业人员.我知道我们可以做一个filter然后groupby但我想在下面同时生成两个聚合

from pyspark.sql import functions as F  
data.groupby("Region").agg(F.avg("Salary"), F.count("IsUnemployed")) 
Run Code Online (Sandbox Code Playgroud)

zer*_*323 22

可能最简单的解决方案是普通CAST(C风格,其中TRUE- > 1,FALSE- > 0)SUM:

(data
    .groupby("Region")
    .agg(F.avg("Salary"), F.sum(F.col("IsUnemployed").cast("long"))))
Run Code Online (Sandbox Code Playgroud)

有一点更具有普遍性和惯用的解决方案是CASE WHENCOUNT:

(data
    .groupby("Region")
    .agg(
        F.avg("Salary"),
        F.count(F.when(F.col("IsUnemployed"), F.col("IsUnemployed")))))
Run Code Online (Sandbox Code Playgroud)

但这里显然是一种矫枉过正.

  • 第二种方法运行速度较慢还是Catalyst优化大致相似的字节码? (2认同)