Как развернуть колонку набок и в массив (Databricks/Spark)?

В Databricks/Spark разворачивание колонки в массив можно выполнить с использованием функции collect_list или collect_array.

collect_list собирает все значения из колонки в список, сохраняя их порядок. К примеру, если у нас есть следующий DataFrame:

+---------+
|   column|
+---------+
|    value1|
|    value2|
|    value3|
+---------+

Мы можем использовать функцию collect_list для развертывания колонки column в массив, создав новую колонку array_column:

from pyspark.sql.functions import collect_list

df = df.withColumn('array_column', collect_list('column'))
df.show()

Это приведет к следующему результату:

+---------+---------------+
|   column|array_column  |
+---------+---------------+
|    value1|[value1, value2, value3]|
|    value2|[value1, value2, value3]|
|    value3|[value1, value2, value3]|
+---------+---------------+

collect_array работает аналогичным образом, однако возвращает массив вместо списка. Развертывание колонки с использованием функции collect_array будет выглядеть следующим образом:

from pyspark.sql.functions import collect_array

df = df.withColumn('array_column', collect_array('column'))
df.show()

Результат будет таким же, но с массивом вместо списка:

+---------+-----------------------+
|   column|array_column           |
+---------+-----------------------+
|    value1|[value1, value2, value3]|
|    value2|[value1, value2, value3]|
|    value3|[value1, value2, value3]|
+---------+-----------------------+

Обратите внимание, что функции collect_list и collect_array могут собирать значения только на одном рабочем узле, поэтому их использование может быть ограничено объемом данных в вашем DataFrame. Если ваш DataFrame очень большой, вам может потребоваться разбить его на несколько частей или использовать другие методы для развертывания колонки в массив, такие как groupBy и agg.