Расширенное партицирование
Партицирование позволяет подсказать для Yandex Query правила размещения данных в Yandex Object Storage.
Предположим, что данные в Yandex Object Storage хранятся в следующей структуре каталогов:
year=2021
month=01
month=02
month=03
year=2022
month=01
При выполнении запроса ниже Yandex Query выполнит следующие действия:
- Получит полный список подкаталогов внутри '/'.
- Для каждого подкаталога выполнит попытку обработать имя подкаталога в формате "year=<DIGITS>".
- Для каждого подкаталога "year=<DIGITS>" получит список всех подкаталогов в формате "month=<DIGITS>".
- Обработает считанные данные.
SELECT
*
FROM
objectstorage.'/'
WITH
(
Schema =
(
data String,
year Int,
month Int
),
partitioned_by =
(
year,
month
)
)
WHERE
year=2021
AND month=02
То есть при работе с партицированными данными выполняется полный листинг содержимого Yandex Object Storage, что может занимать продолжительное время на бакетах большого размера.
Для оптимизации работы на больших объемах данных следует использовать "расширенное партицирование". В этом режиме не происходит сканирования каталогов Yandex Object Storage, вместо этого все пути вычисляются заранее и обращение происходит только к ним.
Для работы расширенного партицирования необходимо задать правила работы через специальный параметр - "projection". В этом параметре описываются все правила размещения данных в каталога Yandex Object Storage.
Синтаксис
Расширенное партицирование называется "partition projection" и задается через параметр projection
.
Пример указания расширенного партицирования:
$projection =
@@
{
"projection.enabled" : true,
"projection.year.type" : "integer",
"projection.year.min" : 2010,
"projection.year.max" : 2022,
"projection.year.interval" : 1,
"projection.month.type" : "integer",
"projection.month.min" : 1,
"projection.month.max" : 12,
"projection.month.interval" : 1,
"projection.month.digits" : 2,
"storage.location.template" : "${year}/${month}"
}
@@;
SELECT
*
FROM
<соединение>.`/`
WITH
(
schema=
(
data String,
year Int,
month Int
),
partitioned_by=(year, month),
projection=$projection
)
В примере выше указывается, что данные существуют за каждый год и каждый месяц с 2010 по 2022 годы, при этом в бакете данные размещены в каталогах вида 2022/12
.
В общем виде настройка расширенного партицирования выглядит следующим образом:
$projection =
@@
{
"projection.enabled" : <доступность_расширенного_партицирования>,
"projection.<имя_поля_1>.type" : "<тип>",
"projection.<имя_поля_1>...." : "<свойства>",
"projection.<имя_поля_2>.type" : "<тип>",
"projection.<имя_поля_2>...." : "<свойства>",
"storage.location.template" : ".../${<имя_поля_2>}/${<имя_поля_1>}/..."
}
@@;
SELECT
*
FROM
<соединение>.<путь>
WITH
(
schema=(<поля>, <поле_1>, <поле_2>),
partitioned_by=(<имя_поля_1>, <имя_поля_2>),
projection=$projection
)
Описание полей
Название поля | Описание поля | Допустимые значения |
---|---|---|
projection.enabled |
Включено или нет расширенное партицирование | true, false |
projection.<имя_поля_1>.type |
Тип данных поля | integer, enum, date |
projection.<имя_поля_1>.XXX |
Свойства конкретного типа |
Поле типа integer
Используется для колонок, чьи значения можно представить в виде целых чисел диапазона -263 до 263-1.
Название поля | Обязательное | Описание поля | Пример значений |
---|---|---|---|
projection.<имя_поля>.type |
Да | Тип данных поля | integer |
projection.<имя_поля>.min |
Да | Определяет минимально допустимое значение. Задается в виде целого числа | -100 004 |
projection.<имя_поля>.max |
Да | Определяет максимально допустимое значение. Задается в виде целого числа | -10 5000 |
projection.<имя_поля>.interval |
Нет, по умолчанию 1 |
Определяет шаг между элементами внутри диапазона значений. Например, шаг 3 при диапазоне значений 2, 10, приведет к следующим значениям: 2, 5, 8 | 2 11 |
projection.<имя_поля>.digits |
Нет, по умолчанию 0 |
Определяет количество цифр в числе. Если ненулевых цифр в числе меньше, чем указанное значение, то значение дополняется нулями спереди вплоть до числа указанного числа цифр. Например, если указано значение .digits=3, а передается число 2, то оно будет превращено в значение 002 | 2 4 |
Поле типа enum
Используется для колонок, чьи значения можно представить в виде перечисления значений.
Название поля | Обязательное | Описание поля | Пример значений |
---|---|---|---|
projection.<имя_поля>.type |
Да | Тип данных поля | enum |
projection.<имя_поля>.values |
Да | Определяет допустимые значения, указанные через запятую. Пробелы не игнорируются | 1, 2 A,B,C |
Поле типа date
Используется для колонок, чьи значения можно представить в виде даты.
Название поля | Обязательное | Описание поля | Пример значений |
---|---|---|---|
projection.<имя_поля>.type |
Да | Тип данных поля | date |
projection.<имя_поля>.min |
Да | Определяет минимально допустимую дату. Разрешены значения в формате YYYY-MM-DD или в виде выражения, содержащего специальную макроподстановку NOW. С макроподстановкой NOW возможно выполнять арифметические действия: NOW-3DAYS, NOW+1MONTH, NOW-6YEARS, NOW+4HOURS, NOW-5MINUTES, NOW+6SECONDS. |
2020-01-01 NOW-5DAYS NOW+3HOURS |
projection.<имя_поля>.max |
Да | Определяет максимально допустимую дату. Разрешены значения в формате YYYY-MM-DD или в виде выражения, содержащего специальную макроподстановку NOW. С макроподстановкой NOW возможно выполнять арифметические действия: NOW-3DAYS, NOW+1MONTH, NOW-6YEARS, NOW+4HOURS, NOW-5MINUTES, NOW+6SECONDS. |
2020-01-01 NOW-5DAYS NOW+3HOURS |
projection.<имя_поля>.format |
Да | Строка форматирования даты на основе strptime |
%Y-%m-%d %D |
projection.<имя_поля>.unit |
Нет | Единицы измерения интервалов времени. Допустимые значения: DAYS | DAYS |
projection.<имя_поля>.interval |
Нет, по умолчанию 1 |
Определяет шаг между элементами внутри диапазона значений с размерностью, указанной в projection.<имя_поля>.unit . Например, для диапазона 2021-02-02, 2021-03-05 шаг 15 c размерностью DAYS приведет к значениям: 2021-02-17, 2021-03-04 |
2 6 |
Шаблоны путей
Данные в бакетах Yandex Object Storage могут быть размещены в каталогах с произвольными названием. С помощью настройки storage.location.template
можно указать правила именования каталогов, где хранятся данные.
Название поля | Описание поля | Пример значений |
---|---|---|
storage.location.template |
Шаблон пути имен каталогов. Задается в формате ${<имя_поля...>}/${<имя_поля...>} |
root/a/${year}/b/${month}/d ${year}/${month} |