Для версий Spark <2.4 вы можете достичь этого без <code>udf, используя sort_array
и struct
.
Сначала получите список столбцов для сортировки
cols_to_sort = df.columns[2:]
print(cols_to_sort)
#['a', 'b', 'c']
Теперь создайте структуру с двумя элементами - "value"
и "key"
."key"
- это имя столбца, а "value"
- это значение столбца.Если вы гарантируете, что "value"
стоит первым в struct
, вы можете использовать sort_array
для сортировки этого массива структур так, как вы хотите.
После того, как массив отсортирован, вам просто нужно перебрать его и извлечь часть "key"
, которая содержит имена столбцов.
from pyspark.sql.functions import array, col, lit, sort_array, struct
df.withColumn(
"descending_columns",
array(
*[
sort_array(
array(
*[
struct([col(c).alias("value"), lit(c).alias("key")])
for c in cols_to_sort
]
),
asc=False
)[i]["key"]
for i in range(len(cols_to_sort))
]
)
).show(truncate=False)
#+---+---+---+---+---+------------------+
#|ID |key|a |b |c |descending_columns|
#+---+---+---+---+---+------------------+
#|0 |1 |5 |2 |1 |[a, b, c] |
#|1 |1 |3 |4 |5 |[c, b, a] |
#+---+---+---+---+---+------------------+
Даже если это выглядит сложно, оно должнообеспечивает более высокую производительность, чем решение udf
.
Обновление : для сортировки по исходному порядку столбцов в случае привязки значения можно вставить другое значение вструктура, которая содержит индекс.Так как сортировка по убыванию, мы используем отрицательный индекс.
Например, если ваш входной фрейм данных был следующим:
df.show()
#+---+---+---+---+---+
#| ID|key| a| b| c|
#+---+---+---+---+---+
#| 0| 1| 5| 2| 1|
#| 1| 1| 3| 4| 5|
#| 2| 1| 4| 4| 5|
#+---+---+---+---+---+
Последняя строка выше имеет связующее значение между a
и b
.В этом случае мы хотим a
отсортировать до b
.
df.withColumn(
"descending_columns",
array(
*[
sort_array(
array(
*[
struct(
[
col(c).alias("value"),
lit(-j).alias("index"),
lit(c).alias("key")
]
)
for j, c in enumerate(cols_to_sort)
]
),
asc=False
)[i]["key"]
for i in range(len(cols_to_sort))
]
)
).show(truncate=False)
#+---+---+---+---+---+------------------+
#|ID |key|a |b |c |descending_columns|
#+---+---+---+---+---+------------------+
#|0 |1 |5 |2 |1 |[a, b, c] |
#|1 |1 |3 |4 |5 |[c, b, a] |
#|2 |1 |4 |4 |5 |[c, a, b] |
#+---+---+---+---+---+------------------+