Эквивалент искры IF, тогда ELSE

Я уже видел этот вопрос здесь, и я взял уроки из этого. Однако я не уверен, почему я получаю сообщение об ошибке, когда чувствую, что он должен работать.

Я хочу создать новый столбец в существующем Spark DataFrame по некоторым правилам. Вот что я написал. iris_spark - это кадр данных с категориальной переменной iris_spark с тремя различными категориями.

from pyspark.sql import functions as F

iris_spark_df = iris_spark.withColumn(
    "Class", 
   F.when(iris_spark.iris_class == 'Iris-setosa', 0, F.when(iris_spark.iris_class == 'Iris-versicolor',1)).otherwise(2))

Выдает следующую ошибку.

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-157-21818c7dc060> in <module>()
----> 1 iris_spark_df=iris_spark.withColumn("Class",F.when(iris_spark.iris_class=='Iris-setosa',0,F.when(iris_spark.iris_class=='Iris-versicolor',1)))

TypeError: when() takes exactly 2 arguments (3 given)


---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-157-21818c7dc060> in <module>()
----> 1 iris_spark_df=iris_spark.withColumn("Class",F.when(iris_spark.iris_class=='Iris-setosa',0,F.when(iris_spark.iris_class=='Iris-versicolor',1)))

TypeError: when() takes exactly 2 arguments (3 given)

Любая идея почему?

Всего 1 ответ


Правильная структура:

(when(col("iris_class") == 'Iris-setosa', 0)
.when(col("iris_class") == 'Iris-versicolor', 1)
.otherwise(2))

что эквивалентно

CASE 
    WHEN (iris_class = 'Iris-setosa') THEN 0
    WHEN (iris_class = 'Iris-versicolor') THEN 1 
    ELSE 2
END

или же:

(when(col("iris_class") == 'Iris-setosa', 0)
    .otherwise(when(col("iris_class") == 'Iris-versicolor', 1)
        .otherwise(2)))

что эквивалентно:

CASE WHEN (iris_class = 'Iris-setosa') THEN 0 
     ELSE CASE WHEN (iris_class = 'Iris-versicolor') THEN 1 
               ELSE 2 
          END 
END

с общим синтаксисом:

when(condition, value).when(...)

или же

when(condition, value).otherwise(...)

Вероятно, вы смешивали вещи с условным условным обозначением Hive IF :

IF(condition, if-true, if-false)

который может использоваться только в сыром SQL с поддержкой Hive.


Есть идеи?

10000