Сначала получите имена столбцов там, где есть фактическое значение, а не ноль. Это можно сделать с помощью такой функции, как:
val notNullColNames = Seq("A", "B", "C", "D").map(c => when(col(c).isNotNull, c))
Обычно для создания массива значений используется array
, однако, это все равно будет возвращать ноль, когда входное значение равно нулю. Вместо этого одним из решений является использование concat_ws
и split
для удаления любых нулевых значений:
df.select($"id", split(concat_ws(",", notNullColNames:_*), ",").as("newColumn"))
Для примера ввода это выведет:
+---+------------+
| id| newColumn|
+---+------------+
| 1| [B, C]|
| 2|[A, B, C, D]|
| 3| [A]|
+---+------------+