Из строк в столбцы с помощью функции pivot

В этой статье мы поговорим о способе преобразования столбцов в строки в 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) в Москве:

Записаться на курс

Смотреть раcписание

Источники
  1. https://spark.apache.org/docs/latest/api/python/reference/api/pyspark.sql.GroupedData.pivot.html

Добавить комментарий

Поиск по сайту