如何在Scala中使用withColumn执行1与列值的减法运算
问题修复方案
核心错误原因
- 空值判断语法不符合Spark规范:DataFrame列空值判断不能使用
=== null语法,必须调用列的isNull方法,否则无法生成正确的逻辑判断表达式 - 常量与列混合运算不规范:Spark列对象无法直接与Scala原生数值执行算术运算,需要通过
lit()函数将常量包装为列类型 - 逻辑运算符优先级隐患:多个判断条件直接用
or连接无括号包裹,会触发运算符优先级错误,导致条件逻辑解析失败
修正后代码
import org.apache.spark.sql.functions.{when, col, lit} val result = finalJoinedDf.withColumn("CTF", when( col("VPC").isNull or col("FreightExpense").isNull or col("FreightRevenue").isNull or col("Cost").isNull, null ).otherwise(lit(1) - col("VPC").cast(DoubleType) / 100) )
补充验证建议
如果执行后仍有报错,可先单独校验col("VPC").cast(DoubleType)的转换结果,确认字段中没有无法转为数值的脏数据。
内容的提问来源于stack exchange,提问作者Tony
相关产品推荐
相关产品推荐

