Поменяйте местами несколько столбцов значений в кадре - PullRequest
0 голосов
/ 23 января 2019

Мне нужно поменять значение нескольких столбцов, основываясь на условии одного из них, и вместо этого использовать API sparkQL

У меня есть DataFrame со столбцами [A, B, C, X, Y, Z] и имеет строки с этим шаблоном:

(1,2,3, ноль, ноль, ноль),(3,3,3, NULL, NULL, NULL),(NULL, NULL, NULL, 5,3,2),(3,1,1, NULL, NULL, NULL),(null, null, null, 3,4,1)

Я хотел бы добиться обмена значениями между группами столбцов (a, b, c) и (x, y, z)когда любая строка имеет условие, что значение в столбце A является нулевым.Поэтому после выполнения таблица должна иметь значения только в столбцах [A, B, C].Я попытался сделать что-то вроде

val result = df.withColumn("A", when(col("A").isNull, col("X")).withColumn("X", when(col("A").isNull,lit(null)).withColumn("B", when(col("A").isNull, col("Y")).withColumn("Y", when(col("A").isNull,lit(null)).withColumn("C", when(col("A").isNull, col("Z")).withColumn("Z", when(col("A").isNull,lit(null)).

Удивительно, но выполнить только это:

val result = df.withColumn ("A", когда (col ("A")).isNull, col ("X")). withColumn ("X", когда (col ("A"). isNull, горит (ноль))

Я получил ожидаемый результат для столбцапоменять местами я определил с этой строкой "(5, null, null, null, 3,2)". Но когда я добавляю операции "withColumn" для других 2 столбцов, я получаю строки, подобные этой "(5, null, null, null, 3,2) "

Буду признателен за любую помощь.

1 Ответ

0 голосов
/ 24 января 2019

После того, как вы поменяете местами «A» и «X», «A» больше не будет нулевым.Следовательно, последующие операции не работают.

Я настоятельно рекомендую вам использовать столбец флага для достижения этой цели.

val result = df
.withColumn("flag", when(col("A").isNull, true).otherwise(false)
.withColumn("A", when(col("flag") === true, col("X"))
.withColumn("X", when(col("flag") === true, lit(null))
.withColumn("B", when(col("flag") === true, col("Y"))
.withColumn("Y", when(col("flag") === true, lit(null))
.withColumn("C", when(col("flag") === true, col("Z"))
.withColumn("Z", when(col("flag") === true, lit(null)).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...