Партицирование данных
В Yandex Object Storage можно хранить очень большие объемы данных. При этом запросы к этим данным могут затрагивать не все данные, а только их часть. Если описать правила разметки структуры хранения ваших данных в Yandex Query, тогда данные, которые не нужны для запроса, можно даже не считывать из Yandex Object Storage. Это значительно ускоряет выполнение запросов без влияния на результат.
Например, данные хранятся в следующей структуре каталогов:
year=2021
month=01
month=02
month=03
year=2022
month=01
Запрос ниже явно подразумевает, что обработать нужно только данные за февраль 2021-го года и другие данные не нужны.
SELECT
*
FROM
objectstorage.'/'
WITH
(
Schema =
(
data String,
year Int,
month Int
)
)
WHERE
year=2021
AND month=02
Если схема партицирования данных не указана, то из Yandex Object Storage будут считаны все хранимые данные, но в результате обработки данные за все другие даты будут отброшены.
Если описать структуру хранения явно, указав, что данные в Yandex Object Storage размещены в каталогах по годам и месяцам
SELECT
*
FROM
objectstorage.'/'
WITH
(
Schema =
(
data String,
year Int,
month Int
),
partitioned_by =
(
year,
month
)
)
WHERE
year=2021
AND month=02
то в процессе исполнения запроса из Yandex Object Storage будут считаны не все данные, а только данные за февраль 2021-го года, что существенно сократит объем обрабатываемых данных и ускорит обработку, при этом результаты обоих запросов будут идентичны.
Примечание
В примере выше показана работа с данными на уровне соединений. Такой пример выбран только для иллюстративных целей. Мы настоятельно рекомендуем для работы с данными использовать "привязки к данным" и не использовать прямую работу с соединениями.
Синтаксис
При работе на уровне соединений партицирование задается с помощью параметра partitioned_by
.
SELECT
*
FROM
<соединение>.<путь>
WITH
(
schema=(<поле_1>, <поле_2>, <поле_3>),
partitioned_by=(<поле_2>, <поле_3>)
)
В параметре partitioned_by
перечисляются колонки схемы данных, по которым партицированы хранимые в Yandex Object Storage данные. Порядок указания полей в параметре partitioned_by определяет вложенность каталогов Yandex Object Storage друг в друга.
Например, partitioned_by=(year, month)
определяет структуру каталогов
year=2021
month=01
month=02
month=03
year=2022
month=01
А partitioned_by=(month, year)
определяет другую структуру каталогов
month=01
year=2021
year=2022
month=02
year=2021
month=03
year=2021
Поддерживаемые типы данных
Партицирование возможно только по следующему набору типов данных YQL:
- Uint16, Uint32, Uint64
- Int16, Int32, Int64
- String
- Bool
При использовании других типов для указания партицирования возвращается ошибка.
Поддерживаемые форматы путей хранения
Формат путей хранения, когда в имени каждого каталога явно указано название колонки, называется "Hive-Metastore форматом" или просто "Hive-форматом".
Такой формат выглядит следующим образом:
month=01
year=2021
year=2022
month=02
year=2021
month=03
year=2021
Важно
Базовый режим партицирования в Yandex Query поддерживает только Hive-формат.
Для указания произвольных путей хранения необходимо воспользоваться режимом Расширенного партицирования данных.