PySpark中withColumn+when结合变量报错:Method or不存在
解决Spark DataFrame混合列条件与常量判断的报错问题
第二段代码报错的核心原因是:dataDF["id"] <= 70返回的是Spark专属的Column类型对象,而otherThing == ""得到的是Python原生布尔值,两者不能直接用|(逻辑或)拼接——Spark的Column逻辑操作只支持和同类型的Column对象运算。
根据你的需求(otherThing值动态变化),给两种解决方案:
方案1:全局判断常量,分支处理
如果只要otherThing为空,所有行的新列都直接设为"A",可以先判断常量值,再决定执行哪种DataFrame逻辑:
from pyspark.sql.functions import when, lit otherThing = "test" dataDF = spark.createDataFrame([(66, "a", "4"), (67, "a", "0"), (70, "b", "4"), (71, "d", "4")], ("id", "code", "amt")) if otherThing == "": dataDF.withColumn("new_column", lit("A")).display() else: dataDF.withColumn("new_column", when(dataDF["id"] <= 70, "A").otherwise("B")).display()
方案2:将常量转为Column对象,保持逻辑组合
如果需要把常量条件和列条件放在同一个when表达式里,用lit()函数把Python布尔值转换成Spark的Column常量即可:
from pyspark.sql.functions import when, lit otherThing = "test" dataDF = spark.createDataFrame([(66, "a", "4"), (67, "a", "0"), (70, "b", "4"), (71, "d", "4")], ("id", "code", "amt")) # 用lit()包装常量判断结果,转为Column类型后就能和列条件拼接 dataDF.withColumn( "new_column", when((dataDF["id"] <= 70) | lit(otherThing == ""), "A").otherwise("B") ).display()
也可以用Column的or()方法替代|,写法更清晰:
dataDF.withColumn( "new_column", when((dataDF["id"] <= 70).or(lit(otherThing == "")), "A").otherwise("B") ).display()
内容的提问来源于stack exchange,提问作者Stachu
相关产品推荐
相关产品推荐

