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

Ссылка скопирована
1 ответ

Добрый день. Используем Databricks на Azure.

Допустим дана табличка наподобие учебной emp.

empno    ename    job    mgr    hiredate    sal    comm    depno 7782    CLARK    MANAGER    7839    1981-06-09    2450    NULL    10 7839    KING    PRESIDENT    NULL    1981-11-17    5000    NULL    10 7934    MILLER    CLERK    7782    1982-01-23    1300    NULL    10 7369    SMITH    CLERK    7902    1980-12-17    800    NULL    20 7566    JONES    MANAGER    7839    1981-04-02    2975    NULL    20 7788    SCOTT    ANALYST    7566    1987-04-19    3000    NULL    20

empno ename job mgr hiredate sal comm depno 7782 CLARK MANAGER 7839 1981-06-09 2450 NULL 10 7839 KING PRESIDENT NULL 1981-11-17 5000 NULL 10 7934 MILLER CLERK 7782 1982-01-23 1300 NULL 10 7369 SMITH CLERK 7902 1980-12-17 800 NULL 20 7566 JONES MANAGER 7839 1981-04-02 2975 NULL 20 7788 SCOTT ANALYST 7566 1987-04-19 3000 NULL 20

Мне из нее нужно средствами SQL сделать нечто вроде.

create table DEPTS_COLLECTION(   id int,   enames ARRAY<string> ) using parquet;  insert into DEPTS_COLLECTION values(10, ARRAY('CLARK','KING','MILLER')); insert into DEPTS_COLLECTION values(20, ARRAY('SMITH','JONES','SCOTT'));

create table DEPTS_COLLECTION( id int, enames ARRAY<string> ) using parquet; insert into DEPTS_COLLECTION values(10, ARRAY('CLARK','KING','MILLER')); insert into DEPTS_COLLECTION values(20, ARRAY('SMITH','JONES','SCOTT'));

Тоесть группируем имена сотрудников по цеху но записываем в массив.

Реальные имена таблиц не могу приводить. NDA. Но суть-таже.

Дополнительно:

Ответы:

Сам себе отвечаю.

collect_list() и explode()

- две функции которые делают нужные преобразования.

Но практически - моя постановка изменилась и сейчас сводится к работе с JSON-arrays которые лежат
в ячейках таблицы. Для них collect/explode мне не подошел. А подошли функции transform и cast.
Часть из них доступны начиная со Spark 3.1.1 и Databricks 9.1.x-LTS Runtime. Поэтому надо модернизироваться срочно.

Нужно решить такую задачу?

Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

Заказать помощь
Лучший ответ
1
Антон С. Ответ

Для того чтобы развернуть колонку набок и в массив в Databricks/Spark, можно воспользоваться функцией collect_list() или collect_set(). Эти функции позволяют объединить значения колонки в массив.

Пример использования collect_list():

from pyspark.sql.functions import collect_list
 
df = spark.createDataFrame([(1, 'a'), (1, 'b'), (2, 'c'), (2, 'd')], ['id', 'value'])
result = df.groupBy('id').agg(collect_list('value').alias('value_array'))
result.show()

from pyspark.sql.functions import collect_list df = spark.createDataFrame([(1, 'a'), (1, 'b'), (2, 'c'), (2, 'd')], ['id', 'value']) result = df.groupBy('id').agg(collect_list('value').alias('value_array')) result.show()

В данном примере мы создаем DataFrame df с колонками 'id' и 'value', затем с помощью функции groupBy() группируем данные по колонке 'id'. Далее с помощью функции agg() и collect_list() создаем новую колонку 'value_array', в которой значения колонки 'value' объединяются в массив.

Если необходимо исключить дубликаты из массива, можно вместо collect_list() использовать collect_set():

from pyspark.sql.functions import collect_set
 
df = spark.createDataFrame([(1, 'a'), (1, 'b'), (2, 'c'), (2, 'd')], ['id', 'value'])
result = df.groupBy('id').agg(collect_set('value').alias('value_array'))
result.show()

from pyspark.sql.functions import collect_set df = spark.createDataFrame([(1, 'a'), (1, 'b'), (2, 'c'), (2, 'd')], ['id', 'value']) result = df.groupBy('id').agg(collect_set('value').alias('value_array')) result.show()

Таким образом, с помощью функций collect_list() и collect_set() можно развернуть колонку набок и получить массив значений в Databricks/Spark.

Другие ответы (0)

Пока нет других ответов. Будьте первым, кто поможет автору.

Ответить на вопрос

комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Вам также может быть интересно