Как выглядят партиции с датой 2024-08-30?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Структура партиций с датой 2024-08-30
Партиции с датой — это способ физического разделения данных на файловой системе или в БД, основанный на временных интервалах. Партиция для даты 2024-08-30 может быть структурирована несколькими способами в зависимости от выбранной схемы партиционирования.
1. Партиции по году/месяцу/дню (самый частый вариант)
/data/events/
└── year=2024/
└── month=08/
└── day=30/
├── events_part1.parquet
├── events_part2.parquet
└── _SUCCESS
Структура:
/warehouse/events/year=2024/month=08/day=30/
time_created=2024-08-30 12:34:56 | user_id=123 | amount=99.50
time_created=2024-08-30 15:22:11 | user_id=456 | amount=150.00
...
Пример Parquet файла:
part-00000-abcd1234.parquet (128 MB)
part-00001-efgh5678.parquet (128 MB)
part-00002-ijkl9012.parquet (64 MB)
2. Партиции по году/неделе
/data/events/
└── year=2024/
└── week=35/ # 35-я неделя года (день августа 30 — это неделя 35)
├── events.parquet
└── _SUCCESS
Август 30, 2024 — это 35-я неделя в году (ISO-8601).
3. Партиции по году/квартали
/data/events/
└── year=2024/
└── quarter=3/ # 3-й квартал (июль-сентябрь)
├── events.parquet
└── _SUCCESS
Август — месяц 3-го квартала, поэтому файл попадёт в quarter=3.
4. Партиции только по дате (без иерархии)
/data/events/
└── date=2024-08-30/
├── events_00000.parquet
└── _SUCCESS
Это менее структурировано, но может использоваться для малых объёмов или простых случаев.
5. Пример в Spark DataFrame
import pyspark.sql.functions as F
from pyspark.sql import SparkSession
spark = SparkSession.builder.appName("Partitioning").getOrCreate()
# Читаем данные
df = spark.read.parquet("/data/events/year=2024/month=08/day=30/")
# Или создаём партиции
df.write \
.mode("overwrite") \
.partitionBy("year", "month", "day") \
.parquet("/data/events_partitioned/")
# Результат: структура как выше
6. Метаданные партиции
Если система поддерживает каталоги метаданных (Hive Metastore):
SHOW PARTITIONS events;
-- Output:
year=2024, month=08, day=29
year=2024, month=08, day=30 ← Именно эта партиция
year=2024, month=08, day=31
-- Количество строк в партиции 2024-08-30
SELECT COUNT(*) FROM events
WHERE year=2024 AND month=08 AND day=30;
7. Оптимизация запроса с такой партицией
# Плохо: сканирует все партиции за 2024 год
df_bad = spark.read.parquet("/data/events/year=2024/month=08/")
result = df_bad.filter((F.year(F.col("timestamp")) == 2024) &
(F.month(F.col("timestamp")) == 8) &
(F.day(F.col("timestamp")) == 30))
# Хорошо: читает только нужную партицию (partition pruning)
df_good = spark.read.parquet("/data/events/year=2024/month=08/day=30/")
По партиции /year=2024/month=08/day=30/ прямое обращение может быть 100x быстрее.
8. Размер файлов в такой партиции
Типичный размер одного дня данных:
/data/events/year=2024/month=08/day=30/
├── part-00000.parquet (512 MB)
├── part-00001.parquet (512 MB)
├── part-00002.parquet (256 MB)
└── _SUCCESS (0 bytes)
Общий размер: ~1.3 GB для одного дня (зависит от объёма данных).
9. Как создать партицию вручную в SQL
-- В Hive/Spark SQL
ALTER TABLE events ADD PARTITION (
year=2024,
month=08,
day=30
) LOCATION /data/events/year=2024/month=08/day=30/;
-- Удаление старых партиций (например, старше 90 дней)
ALTER TABLE events DROP PARTITION (
year=2024,
month=05,
day=15
);
Заключение
Партиция для даты 2024-08-30 обычно структурируется как /year=2024/month=08/day=30/ с несколькими Parquet файлами внутри. Это позволяет системе быстро находить и читать данные за конкретный день без сканирования всего датасета. Правильное партиционирование по дате — одна из основных оптимизаций в Data Engineering.