PySpark如何根据另一列的精度值对指定列执行四舍五入计算
问题原因
PySpark 原生 Python API 提供的round()函数,第二个精度参数仅支持传入固定整数常量,不支持传入Column类型的动态列值,因此直接传f.col("reading_precision")会抛出Column is not iterable报错。
解决方法
方法1:使用expr调用SQL原生ROUND(推荐,无性能损失)
Spark SQL 层面的ROUND函数支持两个参数均为动态列,通过expr直接写SQL表达式即可实现需求:
import pyspark.sql.functions as f df1 = df.withColumn("reading_value", f.expr("ROUND(summary_measure_value, reading_precision)"))
运行后输出结果和预期完全一致。
方法2:自定义UDF实现(仅做参考,性能低于原生方法)
如果需要扩展自定义四舍五入逻辑,可以用UDF实现:
import pyspark.sql.functions as f from pyspark.sql.types import DoubleType def dynamic_round(value, precision): return round(value, precision) udf_round = f.udf(dynamic_round, DoubleType()) df1 = df.withColumn("reading_value", udf_round(f.col("summary_measure_value"), f.col("reading_precision")))
内容的提问来源于stack exchange,提问作者nmr
相关产品推荐
相关产品推荐

