You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PySpark 3.0.1使用when/otherwise修改列时遇AnalysisException问题求助

解决PySpark中when/otherwise创建新列时的AnalysisException错误

嘿,这个问题其实挺典型的,咱们来一步步捋清楚问题出在哪,以及怎么解决:

错误根源分析

你遇到的AnalysisException: Cannot resolve column name "Gross Loan Amount",核心问题有两个:

  1. 引用了不存在的列:你正在创建一个名为Gross Loan Amount的新列,但在otherwise子句里却直接引用了这个还没被创建的列——原DataFrame里根本没有这个列,Spark自然找不到它。
  2. 括号结构错误:你的代码里把.otherwise()挂在了(df['Principal']+df['Agency Fee CP']+df['Agency VAT CP'])这个Column对象上,而不是跟在when()方法后面,这也会导致语法逻辑出错。

对比你的测试案例:你是在修改已存在的列txt,所以otherwise(df_test['txt'])引用的是原DataFrame里本来就有的列,Spark能正常识别;但当前场景是新增列,逻辑完全不一样。

另外还要注意:你的列名包含空格(比如Agency Fee CP),在PySpark里必须用反引号`包裹才能正确解析,否则会被当成多个列名处理。

正确的写法

根据你的需求(满足条件时用计算值,不满足时保留某个现有列的值),这里给出修正后的代码示例:

from pyspark.sql.functions import when, col

# 处理带空格的列名,用反引号包裹;同时修正when/otherwise的结构
df = df.withColumn(
    'Gross Loan Amount',
    when(
        (col('Disb Date') <= '2018-03-19') & (col('ID') != 457),
        col('Principal') + col('`Agency Fee CP`') + col('`Agency VAT CP`')
    ).otherwise(
        # 这里替换成你需要的默认值,比如如果想保留Principal的原值,就写col('Principal')
        col('Principal')
    )
)

如果你的需求是:不满足条件时新列的值为null,可以直接省略.otherwise(),因为Spark默认会给不满足条件的行赋值null。

再回头看测试案例的合理性

你的测试代码之所以能正常运行,是因为你在修改已存在的列txt:

df_test.withColumn('txt',when(df_test['id']==1,'change').otherwise(df_test['txt']))

这里的otherwise(df_test['txt'])引用的是原DataFrame中已经存在的txt列,Spark能直接找到它,所以不会触发解析错误。

内容的提问来源于stack exchange,提问作者J.C Guzman

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 07:25:25