Ваш первый DataFrame PySpark

Биг датаBeginner
Практиковаться сейчас

Введение

Компания получает записи заказов и хочет превращать их в полезную информацию. Прежде чем рассчитывать отчёты продаж, нужен способ представить строки, описать столбцы и попросить инструмент обработки выполнить работу. Вы начнёте с трёх записей, которые легко проверить глазами.

Большие данные — нагрузки на данные, размер, скорость поступления или потребности обработки которых могут перерасти удобный подход на одной машине. Apache Spark — движок обработки данных, способный разделять работу между машинами кластера. PySpark — его интерфейс Python. DataFrame представляет строки с именованными типизированными столбцами и поддерживает операции, например фильтрацию и агрегацию. Spark обрабатывает данные; отдельный файл или система хранения обеспечивает постоянные входные и выходные данные. Курс начинается с крошечных примеров, чтобы вы рассуждали о правильности до перехода к масштабу.

Вы создадите SparkSession, выведете DataFrame, изучите схему и число строк и добавите запись перед повторным запуском. Подготовленная среда использует local[2]: Spark работает на одной машине с двумя потоками выполнения. Это обучает настоящим API Spark, а распределённое развёртывание остаётся отдельной темой. Нужны базовые переменные, списки и вызовы функций Python; с предварительными знаниями поможет путь Python. pandas, Hadoop, Hive, Java, установка и файлы прежних работ не требуются. Используйте терминал.

Запустите полный скрипт небольшого DataFrame

На этом шаге вы запустите полный скрипт, превращающий три записи Python в таблицу Spark. Начните в рабочем каталоге:

cd /home/labex/project

SparkSession — точка входа для создания DataFrame и доступа к API структурированных данных Spark. Построитель задаёт имя приложения, выбирает локальное выполнение и создаёт сеанс. local[2] разрешает два потока выполнения на этой машине, а не создаёт две машины кластера. setLogLevel сокращает последующие информационные журналы, чтобы учебный вывод было легче найти.

В исходном Python from pyspark.sql import SparkSession делает установленный класс доступным программе. Точка обращается к именованному члену, а скобки вызывают метод: df.show() просит DataFrame показать строки. Построитель объединяет несколько вызовов; окружающие скобки позволяют разместить выражение на нескольких строках. Каждую строку можно читать как одну настройку перед получением сеанса через getOrCreate().

Список orders содержит три кортежа — группы значений в скобках. Каждый кортеж задаёт строку в том же порядке, что объявленные столбцы. Строка схемы задаёт имя и тип каждого столбца: текстовые идентификаторы и товары, затем целое количество. createDataFrame использует записи и схему. show просит Spark вывести строки, а stop освобождает сеанс после завершения.

Сохраните полный скрипт. Символ оболочки > записывает указанный файл; маркер PYTHON в кавычках начинает here-документ, буквально сохраняющий заключённый текст Python. Копируйте до последней строки PYTHON включительно:

cat > /home/labex/project/first_dataframe.py <<'PYTHON'
from pyspark.sql import SparkSession

spark = (
    SparkSession.builder
    .appName("FirstOrderTable")
    .master("local[2]")
    .getOrCreate()
)
spark.sparkContext.setLogLevel("ERROR")

orders = [
    ("s1", "notebook", 2),
    ("s2", "pen", 1),
    ("s3", "folder", 3),
]
columns = "order_id string, product string, quantity int"
df = spark.createDataFrame(orders, schema=columns)

df.show()

spark.stop()
PYTHON

Подготовленная команда bigdata-python выбирает среду Python с установленным PySpark. Запустите файл как обычную программу Python, сохраняя обычный вывод локально:

bigdata-python /home/labex/project/first_dataframe.py > /home/labex/project/output/first-run.txt
cat /home/labex/project/output/first-run.txt

Ожидается таблица со столбцами order_id, product и quantity, содержащая s1/notebook/2, s2/pen/1 и s3/folder/3. Предупреждения запуска или сообщения о ходе выполнения могут всё ещё появляться в терминале; они отделены от сохранённой таблицы. Без явной сортировки порядок строк не гарантирован, поэтому определяйте записи по ID заказов.

Ваша программа Python — драйвер: она создаёт сеанс и просит Spark выполнить работу. В кластере процессы исполнителей (executor) выполняют задачи над частями данных. Здесь выполнение происходит локально на той же машине. У вас есть работающая программа без настройки кластера.

Изучите схему и подсчитайте строки

На этом шаге вы отличите допустимое содержимое столбца от числа записей таблицы. Схема перечисляет имена столбцов, типы данных и допустимость NULL. Целочисленный столбец представляет целые числа, подходящие для расчётов количества; текст поддерживает другие операции. Nullable означает допустимость пропуска в поле, а не наличие пропуска в каждой строке.

Добавьте printSchema для изучения описания и count для подсчёта строк. Ниже полный обновлённый файл, поэтому скрытого интерактивного состояния нет:

cat > /home/labex/project/first_dataframe.py <<'PYTHON'
from pyspark.sql import SparkSession

spark = (
    SparkSession.builder
    .appName("FirstOrderTable")
    .master("local[2]")
    .getOrCreate()
)
spark.sparkContext.setLogLevel("ERROR")

orders = [
    ("s1", "notebook", 2),
    ("s2", "pen", 1),
    ("s3", "folder", 3),
]
columns = "order_id string, product string, quantity int"
df = spark.createDataFrame(orders, schema=columns)

df.show()
df.printSchema()
print("Row count:", df.count())

spark.stop()
PYTHON
bigdata-python /home/labex/project/first_dataframe.py > /home/labex/project/output/schema-and-count.txt
cat /home/labex/project/output/schema-and-count.txt

Таблица должна по-прежнему содержать три записи. Под ней найдите:

root
 |-- order_id: string (nullable = true)
 |-- product: string (nullable = true)
 |-- quantity: integer (nullable = true)

Row count: 3

printSchema описывает DataFrame. show и count — действия (actions), запрашивающие у Spark видимый результат или значение. Spark может откладывать значительную часть обработки до запроса ответа действием; в последующих работах ленивое выполнение будет объяснено через преобразования и планы. Число 3 означает три записи заказов, а не сумму количеств, которая ответила бы на другой бизнес-вопрос.

Каждый вызов запускает новый процесс Python и создаёт собственную SparkSession. Файл явно создаёт df; он не полагается на создание spark или df интерактивной оболочкой ранее.

Предположите и проверьте добавление одной записи

На этом шаге вы измените данные, сохранив форму. Предположите, что изменит добавление s4/notebook/1: число строк заказов станет четырьмя, схема останется прежней, а исходные три записи сохранятся. Новая строка — один заказ, хотя notebook уже встречается в другом заказе.

Замените скрипт этой версией, добавляющей только указанную запись:

cat > /home/labex/project/first_dataframe.py <<'PYTHON'
from pyspark.sql import SparkSession

spark = (
    SparkSession.builder
    .appName("FirstOrderTable")
    .master("local[2]")
    .getOrCreate()
)
spark.sparkContext.setLogLevel("ERROR")

orders = [
    ("s1", "notebook", 2),
    ("s2", "pen", 1),
    ("s3", "folder", 3),
    ("s4", "notebook", 1),
]
columns = "order_id string, product string, quantity int"
df = spark.createDataFrame(orders, schema=columns)

df.show()
df.printSchema()
print("Row count:", df.count())

spark.stop()
PYTHON

Снова запустите файл в новом процессе:

bigdata-python /home/labex/project/first_dataframe.py > /home/labex/project/output/expanded-run.txt
cat /home/labex/project/output/expanded-run.txt

Найдите все четыре ID заказов и Row count: 4. Схема должна по-прежнему описывать те же три имени столбцов и типы. Повторение имени товара не группирует заказы автоматически и не удаляет дубликаты; эти операции нужно явно запросить в последующих занятиях.

Прежние first-run.txt и schema-and-count.txt остаются свидетельствами версии с тремя строками. Исполняемый файл теперь описывает версию с четырьмя строками, поэтому другой независимый запуск может воспроизвести результат. Вы завершили небольшой цикл «изменить — предположить — запустить — проверить», который поможет оценивать более крупные процессы данных, а не просто доверять успешному завершению программы.

Итоги

Вы запустили настоящий скрипт PySpark с собственной SparkSession, создали типизированный DataFrame и проверили показанные записи, схему и число строк. Добавление записи изменило число строк, сохранив схему. Далее вы перейдёте от записей внутри Python к CSV-файлу с явной схемой.