Spark Dataframe withColumn, если в противном случае условие не работает в Spark Java - PullRequest
0 голосов
/ 02 марта 2020

В кадре данных искры я пытаюсь назначить значение столбца на основе другого значения столбца при других условиях, используя withColumn Когда Иначе logi c в Spark Java.

На входе есть 3 записи, которые имеет 3 красных, желтых и зеленых значения в столбце CODE соответственно.

Ниже приведены логи c, которые я использую в Spark Java:

df = df.withColumn("TYPE",
((Column) when(df.col("CODE").$eq$bang$eq("RED"),(functions.lit("X")))
.when(df.col("CODE").$eq$bang$eq("YELLOW"),(functions.lit("X")))
.when(df.col("CODE").$eq$bang$eq("GREEN"),(functions.lit("Y"))))
.otherwise(functions.lit("N")).alias("TYPE"));

Ниже приведен результат я получаю:

+---------+----------+
|CODE     |TYPE      |
+---------+----------+
|red      |X         |
|yellow   |X         |
|green    |X         |
+---------+----------+

Вместо того, чтобы получить X, X, Y как TYPE, я получаю все значения как X. Это не проверка равенства, это просто присвоение первого значения из освещенной функции .

Например, даже если я даю случайную строку ('asdfgh') внутри условия проверки (хотя это и ложь), но все же ему присваивается первое значение 'X'.

df = df.withColumn("TYPE",
((Column) when(df.col("CODE").$eq$bang$eq("asdfgh"),(functions.lit("X")))
.when(df.col("CODE").$eq$bang$eq("YELLOW"),(functions.lit("X")))
.when(df.col("CODE").$eq$bang$eq("GREEN"),(functions.lit("Y"))))
.otherwise(functions.lit("N")).alias("TYPE"));

Результат совпадает с приведенным выше результатом

ПРИМЕЧАНИЕ. Столбец «ТИП» - это новый столбец, который я хочу добавить в df, а «КОД» - это существующий столбец.

Пожалуйста, помогите исправить ошибку. логи c

1 Ответ

0 голосов
/ 02 марта 2020

Приведенные выше логики c могут быть несколько представлены следующим образом с использованием if-else:

if (col("CODE") =!= "RED"){
    return "X"
}
else if (col("CODE") =!= "YELLOW") {
    return "X"
}
else if (col("CODE") =!= "GREEN") {
    return "Y"
}
else
{
    return "N"
}

При dry сначала запускает этот код, с примером ввода, где CODE = "RED ". Вывод будет" X ", сгенерированным из:

else if (col("CODE") =!= "YELLOW") {
        return "X"
    }

Во-вторых, учитывая CODE =" ЖЕЛТЫЙ ". Вывод будет" X "из этого блока:

if (col("CODE") =!= "RED"){
        return "X"
    }

В-третьих, учитывая КОД = "ЗЕЛЕНЫЙ". Сгенерированный вывод будет «X», а не «Y», так как этот блок будет выполнен как «ЗЕЛЕНЫЙ» =! = «КРАСНЫЙ» имеет значение true:

if (col("CODE") =!= "RED"){
        return "X"
    }

Я не думаю, что есть способ получить желаемый результат, так как мы используем неравенства, поскольку $eq$bang$eq следует оценить до "=!=". Желаемый результат может быть достигнут оператором равенства ===.

...