Ответ
При партиционировании по дате, данные за 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 преобразуют условие в фильтр по пути и не сканируют другие директории.