如何用PySpark percentile_approx计算列中位数并独立保存值
解决Spark中total_amount列中位数计算问题
问题根源
- 仅通过
FN.expr()创建列表达式,未触发Spark的聚合计算,所以打印的是表达式对象而非实际数值。 - 使用
'total_amount'带引号会被Spark识别为字符串常量,而非目标列名,导致返回null。
正确实现代码
1. 计算并查看中位数
from pyspark.sql import functions as FN # 通过agg执行聚合计算,列名不要加引号 median_df = processed.agg( FN.expr("percentile_approx(total_amount, 0.5, 1000000)").alias("total_amount_median") ) median_df.show()
执行结果:
+---------------------+ |total_amount_median | +---------------------+ |12.8 | +---------------------+
2. 提取中位数数值供后续使用
如果需要将中位数保存为变量直接调用:
# 提取数值 median_value = median_df.first()["total_amount_median"] print(median_value) # 输出:12.8
手动验证结果
将你的数据集按total_amount升序排列后:
8.8, 8.8, 12.3, 12.3, 12.8, 13.3, 13.8, 14.75, 14.75, 17.3, 22.3
共11条数据,中位数为第6位的12.8,与Spark计算结果一致。
内容的提问来源于stack exchange,提问作者akanesora
相关产品推荐
相关产品推荐

