Spark DataFrame DoubleType列四舍五入函数失效,求排查错误
问题分析与解决
你的函数没生效的核心问题是循环中每次都基于原始的df_input生成新的df_output,而非基于上一次处理后的DataFrame。
比如你的DataFrame有col1、col2两个Double类型列:第一次循环处理col1时,df_output是修改了col1的新DataFrame;但第二次循环又用原始的df_input去修改col2,直接覆盖了之前对col1的修改,最后返回的df_output只保留了最后一个Double类型列的修改,其他列的四舍五入操作全被丢弃了。
修正后的代码
def round_df(df_input: DataFrame) -> DataFrame: # 先把df_output初始化为原始输入 df_output = df_input # 遍历所有Double类型列 for c in [f.name for f in df_input.schema.fields if isinstance(f.dataType, DoubleType)]: # 基于当前已处理的df_output继续修改,逐步累积操作 df_output = df_output.withColumn(c, round(sf.col(c), 3)) return df_output
额外优化(可选)
如果想简化代码,也可以用reduce函数一次性处理所有列,省去显式循环:
from functools import reduce def round_df(df_input: DataFrame) -> DataFrame: double_cols = [f.name for f in df_input.schema.fields if isinstance(f.dataType, DoubleType)] return reduce(lambda df, col: df.withColumn(col, round(sf.col(col), 3)), double_cols, df_input)
内容的提问来源于stack exchange,提问作者Vivian
相关产品推荐
相关产品推荐

