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

