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

Spark:如何将布尔列的真假计数转换为分栏统计结果

解决Spark布尔列按年份统计True/False数量的格式转换问题

要实现将每个年份的Arrest列true/false数量转为并列列的需求,你可以用以下两种常用方法:

方法1:使用Pivot(透视表)

通过pivot将Arrest的不同取值转为列,再统计数量:

import org.apache.spark.sql.functions.col

val arrestStats = df.groupBy("Year")
  .pivot("Arrest") // 将Arrest的true/false转为列
  .count() // 统计各分组数量
  .withColumnRenamed("false", "falseArrest") // 重命名列名
  .withColumnRenamed("true", "trueArrest")
  .sort(col("Year").desc)

arrestStats.show()

执行后会直接得到你期望的格式:

+----+-----------+-----------+
|Year|falseArrest| trueArrest|
+----+-----------+-----------+
|2023|      55039|       7555|
|2022|     210722|      27234|
+----+-----------+-----------+

方法2:条件聚合(更高效的固定值场景)

如果Arrest只有true/false两种取值,用条件聚合更直接,性能也更优:

import org.apache.spark.sql.functions.{sum, when, col}

val arrestStats = df.groupBy("Year")
  .agg(
    // 统计Arrest为false的数量
    sum(when(col("Arrest") === false, 1).otherwise(0)).alias("falseArrest"),
    // 统计Arrest为true的数量
    sum(when(col("Arrest") === true, 1).otherwise(0)).alias("trueArrest")
  )
  .sort(col("Year").desc)

arrestStats.show()

说明你之前的错误

你尝试的count("true")是错误用法:count()函数用于统计行数,参数只能是列名(如count("Arrest"))或*,无法直接指定值来过滤统计。要按值过滤统计,必须用条件判断(如上述的when)或先通过where过滤再聚合。

内容的提问来源于stack exchange,提问作者Naif Alonazi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 06:10:23