Перейти к основному содержимому
Версия: 2.0.x

Range partitioning (Устаревший)

Range partitioning подходит для хранения простых непрерывных данных, таких как данные временных рядов или непрерывные числовые данные.

На основе range partitioning вы можете создавать partitions с использованием стратегии динамического партиционирования, которая позволяет управлять временем жизни (TTL) partitions.

примечание

Обратите внимание, что начиная с версии v1.5.2, expression partitioning дополнительно оптимизирован для унификации всех стратегий партиционирования и поддерживает более сложные решения. Он рекомендуется в большинстве случаев и заменит стратегию range partitioning в будущих релизах.

Введение

Range partitioning подходит для часто запрашиваемых данных на основе непрерывных диапазонов дат/чисел. Кроме того, его можно применять в некоторых особых случаях, когда исторические данные необходимо партиционировать по месяцам, а недавние данные нужно партиционировать по дням.

Вам необходимо явно определить столбцы партиционирования данных и установить отношение сопоставления между partitions и диапазонами значений столбцов партиционирования. Во время загрузки данных Selena назначает данные соответствующим partitions на основе диапазонов, к которым относятся значения столбцов партиционирования данных.

Что касается типа данных столбцов партиционирования, до версии v1.5.2 range partitioning поддерживал только столбцы партиционирования типов date и integer. Начиная с версии v1.5.2, три специфические временные функции могут использоваться как столбцы partition. При явном определении отношения сопоставления между partitions и диапазонами значений столбцов партиционирования вам необходимо сначала использовать специфическую временную функцию для преобразования значений столбцов партиционирования из timestamps или strings в значения date, а затем разделить partitions на основе преобразованных значений date.

к сведению
  • Если значение столбца партиционирования является timestamp, вам необходимо использовать функцию from_unixtime или from_unixtime_ms для преобразования timestamp в значение date при разделении partitions. Когда используется функция from_unixtime, столбец партиционирования поддерживает только типы INT и BIGINT. Когда используется функция from_unixtime_ms, столбец партиционирования поддерживает только тип BIGINT.
  • Если значение столбца партиционирования является строкой (тип STRING, VARCHAR или CHAR), вам необходимо использовать функцию str2date для преобразования строки в значение date при разделении partitions.

Использование

Синтаксис

PARTITION BY RANGE ( partition_columns | function_expression ) ( single_range_partition | multi_range_partitions )

partition_columns ::=
<column> [, ...]

function_expression ::=
from_unixtime(column)
| from_unixtime_ms(column)
| str2date(column)

single_range_partition ::=
PARTITION <partition_name> VALUES partition_key_desc

partition_key_desc ::=
LESS THAN { MAXVALUE | value_list }
| value_range

-- value_range - это левозамкнутый, правооткрытый интервал. Пример: `[202201, 202212)`.
-- Вы должны явно указать скобку `[` в полуоткрытом интервале.
value_range ::=
[value_list, value_list)

value_list ::=
( <value> [, ...] )


multi_range_partitions ::=
{ PARTITIONS START ("<start_date_value>") END ("<end_date_value>") EVERY ( INTERVAL <int_value> time_unit )
| PARTITIONS START ("<start_integer_value>") END ("<end_integer_value>") EVERY ( <int_value> ) } -- Значения столбцов partition всё равно должны быть заключены в двойные кавычки, даже если значения столбцов partition, указанные в START и END, являются целыми числами. Однако значения интервалов в предложении EVERY не нужно заключать в двойные кавычки.

time_unit ::=
HOUR | DAY | WEEK | MONTH | YEAR

Параметры

ПараметрыОписание
partition_columnsИмена столбцов партиционирования. Значения столбцов партиционирования могут быть строковыми (BINARY не поддерживается), date или datetime, или целыми числами.
function_expressionФункциональное выражение, которое преобразует столбец партиционирования в определенные типы данных. Поддерживаемые функции: from_unixtime, from_unixtime_ms и str2date.
ПРИМЕЧАНИЕ
Range partitioning поддерживает одно и только одно функциональное выражение.
partition_nameИмя partition. Рекомендуется устанавливать соответствующие имена partitions на основе бизнес-сценария для различения данных в разных partitions.

Пример

  1. Создание partitions путем ручного определения диапазонов значений на основе столбца партиционирования типа date.

    PARTITION BY RANGE(date_col)(
    PARTITION p1 VALUES LESS THAN ("2020-01-31"),
    PARTITION p2 VALUES LESS THAN ("2020-02-29"),
    PARTITION p3 VALUES LESS THAN ("2020-03-31")
    )
  2. Создание partitions путем ручного определения диапазонов значений на основе столбца партиционирования типа integer.

    PARTITION BY RANGE (int_col) (
    PARTITION p1 VALUES LESS THAN ("20200131"),
    PARTITION p2 VALUES LESS THAN ("20200229"),
    PARTITION p3 VALUES LESS THAN ("20200331")
    )
  3. Создание нескольких partitions с одинаковым интервалом дат.

    PARTITION BY RANGE (date_col) (
    START ("2021-01-01") END ("2021-01-04") EVERY (INTERVAL 1 DAY)
    )
  4. Создание нескольких partitions с различными интервалами дат.

    PARTITION BY RANGE (date_col) (
    START ("2019-01-01") END ("2021-01-01") EVERY (INTERVAL 1 YEAR),
    START ("2021-01-01") END ("2021-05-01") EVERY (INTERVAL 1 MONTH),
    START ("2021-05-01") END ("2021-05-04") EVERY (INTERVAL 1 DAY)
    )
  5. Создание нескольких partitions с одинаковым целочисленным интервалом.

    PARTITION BY RANGE (int_col) (
    START ("1") END ("10") EVERY (1)
    )
  6. Создание нескольких partitions с различными целочисленными интервалами.

    PARTITION BY RANGE (int_col) (
    START ("1") END ("10") EVERY (1),
    START ("10") END ("100") EVERY (10)
    )
  7. Использование from_unixtime для преобразования столбца partition типа timestamp (string) в тип date.

    PARTITION BY RANGE(from_unixtime(timestamp_col)) (
    PARTITION p1 VALUES LESS THAN ("2021-01-01"),
    PARTITION p2 VALUES LESS THAN ("2021-01-02"),
    PARTITION p3 VALUES LESS THAN ("2021-01-03")
    )
  8. Использование str2date для преобразования столбца partition типа string в тип date.

    PARTITION BY RANGE(str2date(string_col, '%Y-%m-%d'))(
    PARTITION p1 VALUES LESS THAN ("2021-01-01"),
    PARTITION p2 VALUES LESS THAN ("2021-01-02"),
    PARTITION p3 VALUES LESS THAN ("2021-01-03")
    )

Dynamic partitioning

Selena поддерживает динамическое партиционирование, которое может автоматически управлять временем жизни (TTL) partitions, например, партиционирование новых входных данных в таблицах и удаление устаревших partitions. Эта функция значительно снижает затраты на обслуживание.

Включение динамического партиционирования

Возьмем таблицу site_access в качестве примера. Для включения динамического партиционирования вам необходимо настроить параметр PROPERTIES. Информацию о элементах конфигурации см. в CREATE TABLE.

CREATE TABLE site_access(
event_day DATE,
site_id INT DEFAULT '10',
city_code VARCHAR(100),
user_name VARCHAR(32) DEFAULT '',
pv BIGINT DEFAULT '0'
)
DUPLICATE KEY(event_day, site_id, city_code, user_name)
PARTITION BY RANGE(event_day)(
PARTITION p20200321 VALUES LESS THAN ("2020-03-22"),
PARTITION p20200322 VALUES LESS THAN ("2020-03-23"),
PARTITION p20200323 VALUES LESS THAN ("2020-03-24"),
PARTITION p20200324 VALUES LESS THAN ("2020-03-25")
)
DISTRIBUTED BY HASH(event_day, site_id)
PROPERTIES(
"dynamic_partition.enable" = "true",
"dynamic_partition.time_unit" = "DAY",
"dynamic_partition.start" = "-3",
"dynamic_partition.end" = "3",
"dynamic_partition.prefix" = "p",
"dynamic_partition.buckets" = "32",
"dynamic_partition.history_partition_num" = "0"
);

PROPERTIES:

параметробязательныйописание
dynamic_partition.enableНетВключает динамическое партиционирование. Допустимые значения: TRUE и FALSE. Значение по умолчанию: TRUE.
dynamic_partition.time_unitДаВременная гранулярность для динамически создаваемых partitions. Это обязательный параметр. Допустимые значения: HOUR, DAY, WEEK, MONTH и YEAR. Временная гранулярность определяет формат суффикса для динамически создаваемых partitions.
  • Если значение HOUR, столбец партиционирования может быть только типа DATETIME и не может быть типа DATE. Формат суффикса для динамически создаваемых partitions - yyyyMMddHH, например, 2020032101.
  • Если значение DAY, формат суффикса для динамически создаваемых partitions - yyyyMMdd. Пример суффикса имени partition - 20200321.
  • Если значение WEEK, формат суффикса для динамически создаваемых partitions - yyyy_ww, например 2020_13 для 13-й недели 2020 года.
  • Если значение MONTH, формат суффикса для динамически создаваемых partitions - yyyyMM, например 202003.
  • Если значение YEAR, формат суффикса для динамически создаваемых partitions - yyyy, например 2020.
dynamic_partition.time_zoneНетЧасовой пояс для динамических partitions, который по умолчанию совпадает с часовым поясом системы.
dynamic_partition.startНетНачальное смещение динамического партиционирования. Значение этого параметра должно быть отрицательным целым числом. Partitions до этого смещения будут удалены на основе текущего дня, недели или месяца, который определяется значением параметра dynamic_partition.time_unit. Значение по умолчанию: Integer.MIN_VALUE, а именно -2147483648, что означает, что исторические partitions не будут удаляться.
dynamic_partition.endДаКонечное смещение динамического партиционирования. Значение этого параметра должно быть положительным целым числом. Partitions от текущего дня, недели или месяца до конечного смещения будут созданы заранее.
dynamic_partition.prefixНетПрефикс, добавляемый к именам динамических partitions. Значение по умолчанию: p.
dynamic_partition.bucketsНетКоличество buckets для каждого динамического partition. Значение по умолчанию совпадает с количеством buckets, определенным зарезервированным словом BUCKETS или автоматически установленным Selena.
dynamic_partition.history_partition_numНетКоличество исторических partitions, создаваемых механизмом динамического партиционирования, со значением по умолчанию 0. Когда значение больше 0, исторические partitions создаются заранее. Начиная с версии v1.5.2, Selena поддерживает этот параметр.
dynamic_partition.start_day_of_weekНетКогда dynamic_partition.time_unit равен WEEK, этот параметр используется для указания первого дня каждой недели. Допустимые значения: от 1 до 7. 1 означает понедельник, а 7 означает воскресенье. Значение по умолчанию: 1, что означает, что каждая неделя начинается с понедельника.
dynamic_partition.start_day_of_monthНетКогда dynamic_partition.time_unit равен MONTH, этот параметр используется для указания первого дня каждого месяца. Допустимые значения: от 1 до 28. 1 означает 1-е число каждого месяца, а 28 означает 28-е число каждого месяца. Значение по умолчанию: 1, что означает, что каждый месяц начинается с 1-го числа. Первый день не может быть 29-м, 30-м или 31-м.
dynamic_partition.replication_numНетКоличество реплик для tablets в динамически создаваемых partitions. Значение по умолчанию совпадает с количеством реплик, настроенным при создании таблицы.
примечание

Когда столбец partition имеет тип INT, его формат должен быть yyyyMMdd, независимо от гранулярности времени partition.

Конфигурация FE:

dynamic_partition_check_interval_seconds: интервал для планирования динамического партиционирования. Значение по умолчанию: 600 секунд, что означает, что ситуация с partitions проверяется каждые 10 минут, чтобы определить, соответствуют ли partitions условиям динамического партиционирования, указанным в PROPERTIES. Если нет, partitions будут создаваться и удаляться автоматически.

Просмотр динамических partitions

После включения динамических partitions для таблицы входные данные непрерывно и автоматически партиционируются. Вы можете просмотреть текущие partitions, используя следующий оператор. Например, если текущая дата - 2020-03-25, вы можете видеть только partitions в диапазоне времени от 2020-03-25 до 2020-03-28.

SHOW PARTITIONS FROM site_access;

[types: [DATE]; keys: [2020-03-25];types: [DATE]; keys: [2020-03-26]; )
[types: [DATE]; keys: [2020-03-26];types: [DATE]; keys: [2020-03-27]; )
[types: [DATE]; keys: [2020-03-27];types: [DATE]; keys: [2020-03-28]; )
[types: [DATE]; keys: [2020-03-28];types: [DATE]; keys: [2020-03-29]; )

Если вы хотите создать исторические partitions при создании таблицы, вам необходимо указать dynamic_partition.history_partition_num для определения количества исторических partitions, которые нужно создать. Например, если вы установите dynamic_partition.history_partition_num в 3 при создании таблицы и текущая дата - 2020-03-25, вы увидите только partitions в диапазоне времени от 2020-03-22 до 2020-03-28.

SHOW PARTITIONS FROM site_access;

[types: [DATE]; keys: [2020-03-22];types: [DATE]; keys: [2020-03-23]; )
[types: [DATE]; keys: [2020-03-23];types: [DATE]; keys: [2020-03-24]; )
[types: [DATE]; keys: [2020-03-24];types: [DATE]; keys: [2020-03-25]; )
[types: [DATE]; keys: [2020-03-25];types: [DATE]; keys: [2020-03-26]; )
[types: [DATE]; keys: [2020-03-26];types: [DATE]; keys: [2020-03-27]; )
[types: [DATE]; keys: [2020-03-27];types: [DATE]; keys: [2020-03-28]; )
[types: [DATE]; keys: [2020-03-28];types: [DATE]; keys: [2020-03-29]; )

Изменение свойств динамического партиционирования

Вы можете использовать оператор ALTER TABLE для изменения свойств динамического партиционирования, например, отключения динамического партиционирования. Возьмем следующий оператор в качестве примера.

ALTER TABLE site_access
SET("dynamic_partition.enable"="false");
примечание
  • Чтобы проверить свойства динамического партиционирования таблицы, выполните оператор SHOW CREATE TABLE.
  • Вы также можете использовать оператор ALTER TABLE для изменения других свойств таблицы.