Вы когда-нибудь хотели повернуть фрейм данных Spark, чтобы преобразовать строки в столбцы или наоборот? Позвольте мне сказать вам, что Spark предоставляет для этого простую функцию. В этом блоге мы рассмотрим, что делает функция поворота. В чем разница между поворотом и транспонированием? И как вы его используете, если вам нужно получить максимальную пользу от ваших данных?
Я буду использовать PySpark, но имейте в виду, что одна и та же функция доступна в Scala, Java и R Spark API.
Что такое сводная таблица?
Сводная таблица — это представление данных таблицы, используемое для вычисления обобщенных и агрегированных данных в табличном формате. Сводные таблицы позволяют изменять порядок данных в соответствии с вашими потребностями. Процесс создания сводной таблицы включает в себя выбор набора переменных, которые вы хотите суммировать, а затем группировку данных по этим переменным. Он предполагает ротацию или транспонирование строк данных в столбцы на основе определенных критериев, таких как группировка и агрегирование.
До создания Apache Spark операция сведения уже была доступна в традиционных базах данных SQL и реализовывалась посредством SQL-запросов. Обычно этого достигали с помощью агрегатных функций и условных выражений. Конкретный синтаксис поворота данных различался в разных системах управления базами данных, но общая концепция оставалась неизменной.
Сводные таблицы обычно используются в анализе данных и бизнес-аналитике. Они позволяют преобразовывать большие и сложные наборы данных в простые и понятные таблицы, которые предоставляют ценную информацию о ваших данных.
Как мне повернуть фрейм данных в PySpark?
Функция поворота — это преобразование, которое выполняется над кадром данных. В этом примере мы начнем с создания образца данных о ценах продажи автомобилей в некоторых городах США.
from pyspark.sql import SparkSession spark = SparkSession.builder.appName("CarSales").getOrCreate() data = [ ("Toyota", "NewYork", 25000), ("Honda", "SanFrancisco", 22000), ("Ford", "NewYork", 28000), ("Toyota", "NewYork", 26000), ("Honda", "SanFrancisco", 23000), ("Ford", "NewYork", 29000), ("Toyota", "NewYork", 24000), ("Honda", "SanFrancisco", 21000), ("Ford", "SanFrancisco", 27000), ("Toyota", "NewYork", 23000), ("Honda", "SanFrancisco", 22000), ("Ford", "SanFrancisco", 30000) ] columns = ["Model", "City", "Price"] df = spark.createDataFrame(data, columns)
Поскольку мы будем выполнять группировку по операциям, мы группируем данные по нужным столбцам. Это создаст объект GroupedData, который мы будем использовать для поворота.
Spark предлагает различные функции агрегирования, которые можно применять при повороте данных. Вот некоторые часто используемые функции агрегирования:
- сумма: вычисляет сумму значений в каждой сводной ячейке. Полезно для агрегирования числовых данных, таких как общий объем продаж или доход.
- avg: вычисляет среднее значение в каждой сводной ячейке. Идеально подходит для получения среднего значения числовых данных, таких как средние цены.
- count подсчитывает количество вхождений в каждую сводную ячейку. Полезно для подсчета категориальных данных или количества событий.
- макс/мин определяет максимальное значение в каждой сводной ячейке. Полезно для поиска самого высокого или самого низкого значения в категории.
- collect_list/collect_set: собирает значения внутри каждой сводной ячейки в список или набор соответственно. Полезно для агрегирования и сохранения нескольких значений в категории. Списки могут содержать повторяющиеся значения; наборы будут содержать разные значения.
grouped_data = df.groupBy("Model", "City") pivoted_data = grouped_data.pivot("City").avg("Price").drop("City") pivoted_data.show()
Вы можете видеть, что значения столбцов «Город» теперь являются сводными столбцами, а значения представляют собой матрицу средних цен модели в городе. Мы можем использовать столбец model в качестве опорной точки:
pivoted_data = grouped_data.pivot("Model").avg("Price").drop("Model") pivoted_data.show()
Мы можем использовать формат карты для указания агрегатов.
pivoted_data = grouped_data.pivot("City").avg("Price").drop("City") result_sum = pivoted_data.agg({"NewYork": "sum", "SanFrancisco": "sum"}) result_sum.show() result_avg = pivoted_data.agg({"NewYork": "avg", "SanFrancisco": "avg"}) result_avg.show() result_count = pivoted_data.agg({"NewYork": "count", "SanFrancisco": "count"}) result_count.show() result_max = pivoted_data.agg({"NewYork": "max", "SanFrancisco": "max"}) result_max.show() result_min = pivoted_data.agg({"NewYork": "min", "SanFrancisco": "min"}) result_min.show() # We can also create a different aggregation one for each city # For instance having the min price at New York city and the max price at San Francisco result_mix = pivoted_data.agg({"NewYork": "min", "SanFrancisco": "max"}) result_mix.show()
А если вы заинтересованы в повороте на основе выбора значений столбца, вы можете передать массив этих значений в функцию поворота, чтобы пропустить оставшиеся. Например, нам не нужно получать данные Honda.
💡 Примечание
Поворот и транспонирование это две разные операции.
- Сведение предполагает группировку данных по одной или нескольким переменным (называемым сводными переменными) и переставить его так, чтобы значения другой переменной отображались в столбцах.
- Транспонирование предполагает переворачивание кадра данных так, чтобы столбцы стали строками, а строки — столбцами, без группировки или агрегирования данных.
Возможность поворачивать и создавать таблицы данных является ключевой особенностью анализа данных. Как мы видели, сводные таблицы позволяют реорганизовывать и агрегировать данные, группируя их по определенным критериям, в результате чего таблицы становятся более удобочитаемыми и информативными. Подобная информация в таких областях, как анализ данных и бизнес-аналитика, имеет решающее значение для упрощения сложных наборов данных и их лучшего понимания.