Как выглядят файлы партиции с датой 2024-08-30 в Spark/Hive?

«Как выглядят файлы партиции с датой 2024-08-30 в Spark/Hive?» — вопрос из категории Apache Spark, который задают на 33% собеседований Data Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

При партиционировании по дате, данные за 2024-08-30 физически хранятся в отдельной директории (или наборе директорий) внутри общей папки таблицы. Имя директории соответствует шаблону имя_колонки=значение. Это стандартный формат Hive.

Структура на файловой системе (HDFS/S3):

/user/hive/warehouse/sales_db/events/
├── dt=2024-08-28/          # Партиция за 28 августа
│   ├── part-00000.parquet
│   └── part-00001.parquet
├── dt=2024-08-29/          # Партиция за 29 августа
│   └── part-00000.parquet
└── dt=2024-08-30/          # Партиция за 30 августа 2024
    ├── part-00000.parquet
    ├── part-00001.parquet
    └── part-00002.parquet

Как с этим работать в коде:

// 1. Чтение всей таблицы, но с автоматическим партишн-прунингом
val df = spark.read.table("sales_db.events")
val dfAug30 = df.filter(col("dt") === "2024-08-30") // Spark прочитает ТОЛЬКО файлы из dt=2024-08-30/

// 2. Прямое чтение по пути партиции (еще более эффективно)
val dfDirect = spark.read.parquet("/user/hive/warehouse/sales_db/events/dt=2024-08-30")

// 3. Создание внешней таблицы Hive, указывающей на эти данные
spark.sql("""
  CREATE EXTERNAL TABLE sales_db.events_20240830
  LIKE sales_db.events
  LOCATION '/user/hive/warehouse/sales_db/events/dt=2024-08-30'
""")

Важные детали:

  • Формат значения в имени директории всегда строка. Даты приводятся к строковому виду.
  • Если партиционирование вложенное (например, PARTITIONED BY (year INT, month INT, day INT)), путь будет выглядеть как /.../year=2024/month=08/day=30/.
  • Внутри директории партиции файлы обычно имеют имена в формате Spark (part-xxxxx.<format>).
  • При запросе SELECT * FROM events WHERE dt = '2024-08-30' Hive/Spark преобразуют условие в фильтр по пути и не сканируют другие директории.