В этой статье мы поговорим о способе преобразования столбцов в строки в Apache Spark. Для этого воспользуемся специальным методом (функцией) — pivot.
Группировка не преобразует значения строк в виде самих столбцов
Иногда встречаются такие задачи, которые требуют одновременно сгруппировать и развернуть значения строк в столбцы. Обычная группировка по столбцу применяется к исходной таблице, а к значениям сгруппированной таблицы применяется функция агрегации. Рассмотрим пример. Допустим у нас имеется некоторая таблица и нам нужно посчитать среднее по одной группе. Например, найти среднюю зарплату для каждого языка программирования из следующей таблицы:
df = spark.createDataFrame([ ('py', 'Anton', 'Moscow', 23), ('c', 'Anna', 'Omsk', 27), ('py', 'Andry', 'Moscow', 24), ('cpp', 'Alex', 'Moscow', 32), ('cpp', 'Boris', 'Omsk', 55), ('py', 'Vera', 'Moscow', 89), ], ['lang', 'name', 'city', 'salary'])
Группировка осуществляется через метод groupBy
(или groupby
), в который нужно передать требуемый для группировки столбец. Результатом метода является объект GrouppedData
. Сам по себе этот объект ценности не представляет, но над ним можно применять функции агрегации (сумму, максимальное, минимальное, среднее по группе, а также применять собственные функции). Пример кода для подсчета среднего в группе:
grouped = df.groupBy('lang') grouped.mean('salary').show() """ +----+------------------+ |lang| avg(salary)| +----+------------------+ | py|45.333333333333336| | c| 27.0| | cpp| 43.5| +----+------------------+ """
Код курса
SPARK
Ближайшая дата курса
по запросу
Продолжительность
ак.часов
Стоимость обучения
0 руб.
А что если нужно определить среднюю зарплату в городе для данного языка программирования. Самым простым вариантом является передача сразу нескольких аргументов в метод groupBy
. Вот так это выглядит:
df.groupBy('lang', 'city').mean('salary').show() """ +----+------+------------------+ |lang| city| avg(salary)| +----+------+------------------+ | cpp| Omsk| 55.0| | py|Moscow|45.333333333333336| | cpp|Moscow| 32.0| | c| Omsk| 27.0| +----+------+------------------+ """
Теперь возникает вопрос: можно ли развернуть таблицу так, что город встанет в заголовке? Ведь такая таблица гораздо легче воспринимается. Так вот — да, можно. Это делается с помощью метода pivot
.
Метод pivot в Apache Spark преобразует значения строк в столбцы
Метод pivot
разворачивает сгруппированные значения в отдельные столбцы. Принимает в качестве первого аргумента название столбца, а вторым и опциональным аргументов является список с конкретными записями этого столбца (например, мы можем рассмотреть только c
и cpp
, передав их в виде списка ['c', 'cpp']
). Результатом также является GrouppedData
, поэтому к нему нужно применить функцию агрегации. Использование pivot
может быть таким для нашего примера:
df.groupBy('lang').pivot('city').mean('salary').show() """ +----+------------------+----+ |lang| Moscow|Omsk| +----+------------------+----+ | py|45.333333333333336|null| | c| null|27.0| | cpp| 32.0|55.0| +----+------------------+----+ """
Теперь намного проще сопоставить зарплату в городе для каждого языка программирования. Там где значение отсутствует, Spark вставляет null
.
Также можно уточнить какие значения использовать в качестве столбцов с помощью второго аргумента. Для этого нужно передать список необходимых значений. Например, чтобы получить таблицу только для Москвы, то нужно сделать так:
grouped.pivot('city', ['Moscow']).show() """ +----+------------------+ |lang| Moscow| +----+------------------+ | py|45.333333333333336| | c| null| | cpp| 32.0| +----+------------------+ """
Конечно, если бы было больше городов, то их также можно добавить в список (если бы добавили Омск, то получилась таблица выше).
О том, как преобразовать таблицы для анализа данных в Apache Spark вы узнаете на наших образовательных курсах в лицензированном учебном центре обучения и повышения квалификации руководителей и ИТ-специалистов (менеджеров, архитекторов, инженеров, администраторов, Data Scientist’ов и аналитиков Big Data) в Москве:
- Основы Apache Spark для разработчиков
- Анализ данных с Apache Spark
- Потоковая обработка в Apache Spark