Pyspark SQL 表达式与 when() 作为 case 语句
Pyspark SQL expression versus when() as a case statement
我在之前的查询中创建了一个名为 v1 的字段。然后我尝试从中创建一个新的派生字段。
一种方法有效,另一种无效。我不明白,我希望它们是等价的。
这个有效:
df = df.withColumn("outcome",expr("case when v1 = 0 then 1 when v1 > 0 then 2 else 0 end"))
这失败了:
df = df.withColumn("outcome", F.when(F.col("v1") == 0, 1)
.F.when(F.col("v1") >0, 2)
.otherwise(0))
有错误:
Py4JJavaError: An error occurred while calling o520.when.
: java.lang.IllegalArgumentException: when() can only be applied on a Column previously generated by when() function
您从 pyspark.sql.functions
或 F
调用了 when
,您需要链接您的 when
条件(如 F.when().when().when().otherwise()
),您不需要需要再次从 F
调用它。
只需将您的代码更改为:
df = df.withColumn("outcome", F.when(F.col("v1") == 0, 1)
.when(F.col("v1") >0, 2)
.otherwise(0))
我在之前的查询中创建了一个名为 v1 的字段。然后我尝试从中创建一个新的派生字段。
一种方法有效,另一种无效。我不明白,我希望它们是等价的。
这个有效:
df = df.withColumn("outcome",expr("case when v1 = 0 then 1 when v1 > 0 then 2 else 0 end"))
这失败了:
df = df.withColumn("outcome", F.when(F.col("v1") == 0, 1)
.F.when(F.col("v1") >0, 2)
.otherwise(0))
有错误:
Py4JJavaError: An error occurred while calling o520.when.
: java.lang.IllegalArgumentException: when() can only be applied on a Column previously generated by when() function
您从 pyspark.sql.functions
或 F
调用了 when
,您需要链接您的 when
条件(如 F.when().when().when().otherwise()
),您不需要需要再次从 F
调用它。
只需将您的代码更改为:
df = df.withColumn("outcome", F.when(F.col("v1") == 0, 1)
.when(F.col("v1") >0, 2)
.otherwise(0))