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.functionsF 调用了 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))