PySpark遍历DataFrame列表批量将列名转为大写不生效如何解决
问题原因
- PySpark DataFrame属于不可变对象,调用
withColumnRenamed方法不会修改原DataFrame,只会返回一个修改后的新DataFrame实例 - 循环中临时变量
x仅持有原DataFrame的引用,对x重新赋值只是让x指向了新的改完列名的实例,并不会修改原df1/df2/df3变量的指向,也无法修改你定义的元组内的元素(元组本身也是不可变类型) - 额外注意:不要用
list作为变量名,会覆盖Python内置的list类型,容易引发后续不可预期的错误
解决方法
先封装一个列名统一转大写的工具函数,推荐用select一次性完成修改,比多次调用withColumnRenamed性能更高:
def upper_df_columns(df): return df.select(*[df[col_name].alias(col_name.upper()) for col_name in df.columns])
方案1:保留原单个df变量
直接对原变量批量重新赋值即可:
df1, df2, df3 = [upper_df_columns(df) for df in [df1, df2, df3]]
方案2:直接使用处理后的DataFrame列表
如果不需要单独保留原变量,直接生成处理后的列表使用即可:
raw_dfs = [df1, df2, df3] processed_dfs = [upper_df_columns(df) for df in raw_dfs] # 后续直接使用processed_dfs[0]/processed_dfs[1]等访问对应df
内容的提问来源于stack exchange,提问作者Niels
相关产品推荐
相关产品推荐

