Я уже видел этот вопрос здесь, и я взял уроки из этого. Однако я не уверен, почему я получаю сообщение об ошибке, когда чувствую, что он должен работать.
Я хочу создать новый столбец в существующем 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.