PySpark 3.0.1使用when/otherwise修改列时遇AnalysisException问题求助
解决PySpark中when/otherwise创建新列时的AnalysisException错误
嘿,这个问题其实挺典型的,咱们来一步步捋清楚问题出在哪,以及怎么解决:
错误根源分析
你遇到的AnalysisException: Cannot resolve column name "Gross Loan Amount",核心问题有两个:
- 引用了不存在的列:你正在创建一个名为
Gross Loan Amount的新列,但在otherwise子句里却直接引用了这个还没被创建的列——原DataFrame里根本没有这个列,Spark自然找不到它。 - 括号结构错误:你的代码里把
.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
相关产品推荐
相关产品推荐

