Pyspark SQL 表达式与 when() 作为 case 语句

B_M*_*ner 1 apache-spark-sql pyspark

我在之前的查询中创建了一个名为 v1 的字段。然后我尝试从中创建一个新的派生字段。

一种方法有效,另一种则无效。我不明白,我希望它们是等价的。

这有效:

df = df.withColumn("outcome",expr("case when v1 = 0 then 1 when v1 > 0 then 2 else 0 end"))
Run Code Online (Sandbox Code Playgroud)

这失败了:

df = df.withColumn("outcome", F.when(F.col("v1") == 0, 1)
      .F.when(F.col("v1") >0, 2)
      .otherwise(0))
Run Code Online (Sandbox Code Playgroud)

有错误:

Py4JJavaError: An error occurred while calling o520.when.
: java.lang.IllegalArgumentException: when() can only be applied on a Column previously generated by when() function
Run Code Online (Sandbox Code Playgroud)

pis*_*all 12

您已经whenpyspark.sql.functions或调用F,您需要链接您的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))
Run Code Online (Sandbox Code Playgroud)