Как развернуть колонку набок и в массив (Databricks/Spark)?
Добрый день. Используем 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. Поэтому надо модернизироваться срочно.
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос
Для того чтобы развернуть колонку набок и в массив в 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()
В данном примере мы создаем 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()
Таким образом, с помощью функций collect_list() и collect_set() можно развернуть колонку набок и получить массив значений в Databricks/Spark.