Выражение SQL Pyspark против when () в качестве оператора case - PullRequest
0 голосов
/ 01 ноября 2019

Я создаю поле с именем 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

1 Ответ

0 голосов
/ 01 ноября 2019

Вы позвонили when из pyspark.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))
...