Временные партиции

В этом разделе описывается, как использовать функцию временных партиций.

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

Функция временных партиций полезна в следующих сценариях:

  • Атомарная перезапись

    Если нужно перезаписать данные в партиции, сохранив доступность для чтения во время перезаписи, сначала создайте временную партицию на основе исходной «формальной» партиции и загрузите новые данные во временную партицию. Затем выполните операцию замены (replace), чтобы атомарно подменить исходную партицию временной. Для непартиционированных таблиц см. ALTER TABLE - SWAP.

  • Регулирование параллелизма запросов к партиции

    Если нужно изменить число бакетов у партиции, сначала создайте временную партицию с тем же диапазоном, что и у исходной партиции, и укажите новое число бакетов. Затем с помощью INSERT INTO загрузите данные из исходной партиции во временную. После этого выполните операцию замены для атомарной подмены исходной партиции временной.

  • Изменение правил партиционирования

    Если требуется изменить стратегию — например, объединить партиции или разбить крупную партицию на несколько мелких, — сначала создайте временные партиции с желаемыми диапазонами. Затем с помощью INSERT INTO загрузите данные из исходных партиций во временные. После этого выполните операцию замены для атомарной подмены исходных партиций временными.

Создание временных партиций

Создавать по одной или несколько временных партиций можно с помощью команды ALTER TABLE.

Синтаксис

Создать одну временную партицию

ALTER TABLE <table_name>
ADD TEMPORARY PARTITION <temporary_partition_name> VALUES [("value1"), {MAXVALUE|("value2")})]
[(partition_desc)]
[DISTRIBUTED BY HASH(<bucket_key>)];
ALTER TABLE <table_name> 
ADD TEMPORARY PARTITION <temporary_partition_name> VALUES LESS THAN {MAXVALUE|(<"value">)}
[(partition_desc)]
[DISTRIBUTED BY HASH(<bucket_key>)];

Создать несколько партиций за раз

ALTER TABLE <table_name>
ADD TEMPORARY PARTITIONS START ("value1") END ("value2") EVERY {(INTERVAL <num> <time_unit>)|<num>}
[(partition_desc)]
[DISTRIBUTED BY HASH(<bucket_key>)];

Параметры

partition_desc: задаёт число бакетов и свойства временных партиций, такие как число реплик и тип носителя.

Примеры

Создать временную партицию tp1 в таблице site_access с диапазоном [2020-01-01, 2020-02-01) с помощью синтаксиса VALUES [(...), (...)]:

ALTER TABLE site_access
ADD TEMPORARY PARTITION tp1 VALUES [("2020-01-01"), ("2020-02-01"));

Создать временную партицию tp2 в таблице site_access и задать верхнюю границу 2020-03-01 с помощью VALUES LESS THAN (...). StarRocks возьмёт верхнюю границу предыдущей временной партиции в качестве нижней границы новой, получив полуинтервал [2020-02-01, 2020-03-01).

ALTER TABLE site_access
ADD TEMPORARY PARTITION tp2 VALUES LESS THAN ("2020-03-01");

Создать временную партицию tp3 с верхней границей 2020-04-01 и числом реплик 1:

ALTER TABLE site_access
ADD TEMPORARY PARTITION tp3 VALUES LESS THAN ("2020-04-01")
 ("replication_num" = "1")
DISTRIBUTED BY HASH (site_id);

Пакетно создать временные партиции синтаксисом START (...) END (...) EVERY (...) для диапазона [2020-04-01, 2021-01-01) с месячной гранулярностью:

ALTER TABLE site_access 
ADD TEMPORARY PARTITIONS START ("2020-04-01") END ("2021-01-01") EVERY (INTERVAL 1 MONTH);

Примечания по использованию

  • Столбец партиционирования во временной партиции должен совпадать со столбцом партиционирования исходной партиции, на основе которой она создаётся, и не может быть изменён.

  • Имя временной партиции не должно совпадать с именем какой‑либо формальной или другой временной партиции.

  • Диапазоны всех временных партиций в таблице не должны пересекаться, но диапазоны временной и формальной партиций могут пересекаться.

Просмотр временных партиций

Просмотреть временные партиции можно командой SHOW TEMPORARY PARTITIONS.

SHOW TEMPORARY PARTITIONS FROM [db_name.]table_name [WHERE] [ORDER BY] [LIMIT]

Загрузка данных во временные партиции

Данные можно загружать во временные партиции с помощью INSERT INTO, STREAM LOAD или BROKER LOAD.

Загрузка с помощью INSERT INTO

Пример:

INSERT INTO site_access TEMPORARY PARTITION (tp1) VALUES ("2020-01-01",1,"ca","lily",4);
INSERT INTO site_access TEMPORARY PARTITION (tp2) SELECT * FROM site_access_copy PARTITION p2;
INSERT INTO site_access TEMPORARY PARTITION (tp3, tp4,...) SELECT * FROM site_access_copy PARTITION (p3, p4,...);

Загрузка с помощью STREAM LOAD

Пример:

curl --location-trusted -u root: -H "label:123" -H "Expect:100-continue" -H "temporary_partitions: tp1, tp2, ..." -T testData \
    http://host:port/api/example_db/site_access/_stream_load    

Загрузка с помощью BROKER LOAD

Пример:

LOAD LABEL example_db.label1
(
    DATA INFILE("hdfs://hdfs_host:hdfs_port/user/starrocks/data/input/file")
    INTO TABLE my_table
    TEMPORARY PARTITION (tp1, tp2, ...)
    ...
)
WITH BROKER
(
    StorageCredentialParams
);

StorageCredentialParams — это набор параметров аутентификации, зависящий от выбранного способа.

Загрузка с помощью ROUTINE LOAD

Пример:

CREATE ROUTINE LOAD example_db.site_access ON example_tbl
COLUMNS(col, col2,...),
TEMPORARY PARTITIONS(tp1, tp2, ...)
FROM KAFKA
(
    "kafka_broker_list" ="<kafka_broker1_ip>:<kafka_broker1_port>,<kafka_broker2_ip>:<kafka_broker2_port>",
    "kafka_topic" = "ordertest"
);

Запрос данных во временных партициях

Для выборки данных из указанных временных партиций используйте оператор SELECT.

SELECT * FROM
site_access TEMPORARY PARTITION (tp1);

SELECT * FROM
site_access TEMPORARY PARTITION (tp1, tp2, ...);

SELECT event_day,site_id,pv FROM
site_access TEMPORARY PARTITION (tp1, tp2, ...);

Можно выполнять JOIN между временными партициями двух таблиц:

SELECT * FROM
site_access TEMPORARY PARTITION (tp1, tp2, ...)
JOIN
site_access_copy TEMPORARY PARTITION (tp1, tp2, ...)
ON site_access.site_id=site_access1.site_id and site_access.event_day=site_access1.event_day;

Замена формальных партиций временными

Чтобы заменить исходную формальную партицию временной, используйте оператор ALTER TABLE. В результате будет создана новая формальная партиция. Исходная формальная партиция и временная партиция, задействованные в операторе ALTER TABLE, удаляются без возможности восстановления.

Синтаксис

ALTER TABLE table_name REPLACE PARTITION (partition_name) WITH TEMPORARY PARTITION (temporary_partition_name1, ...)
PROPERTIES ("key" = "value");

Параметры

  • strict_range

    Значение по умолчанию: true.

    При true объединение диапазонов всех исходных формальных партиций должно в точности совпадать с объединением диапазонов временных партиций, используемых для замены. При false достаточно, чтобы диапазоны новых формальных партиций не пересекались с другими формальными партициями после замены.

    • Пример 1:

      В примере ниже объединение диапазонов исходных партиций p1, p2, p3 совпадает с объединением диапазонов временных tp1 и tp2, поэтому tp1 и tp2 могут заменить p1, p2, p3.

      Диапазоны p1, p2, p3 => Объединения

      [10, 20), [20, 30), [40, 50) => [10, 30), [40, 50)

      Диапазоны tp1 и tp2 => Объединения

      [10, 30), [40, 45), [45, 50) => [10, 30), [40, 50)

    • Пример 2:

      Ниже объединение диапазонов исходной партиции отличается от объединения диапазонов временных. Если strict_range=true, tp1 и tp2 не могут заменить p1. Если strict_range=false, и диапазоны [10, 30) и [40, 50) не пересекаются с другими формальными партициями, замена допустима.

      Диапазон исходной p1 => Объединение

      [10, 50) => [10, 50)

      Диапазоны tp1 и tp2 => Объединения

      [10, 30), [40, 50) => [10, 30), [40, 50)

  • use_temp_partition_name

    Значение по умолчанию: false.

    Если количество исходных формальных партиций совпадает с числом временных партиций для замены, и use_temp_partition_name=false, имена новых формальных партиций сохраняются. Если true, имена временных партиций используются как имена новых формальных.

    В примере ниже при false имя новой партиции остаётся p1, но данные и свойства берутся из tp1. При true имя меняется на tp1, а p1 более не существует.

    ALTER TABLE tbl1 REPLACE PARTITION (p1) WITH TEMPORARY PARTITION (tp1);
    

    Если количество заменяемых формальных партиций отличается от числа временных, и параметр оставлен false, значение параметра игнорируется.

    В примере ниже после замены имя новой партиции — tp1, а p1 и p2 удаляются:

    ALTER TABLE site_access REPLACE PARTITION (p1, p2) WITH TEMPORARY PARTITION (tp1);
    

Примеры

Заменить формальную партицию p1 временной tp1:

ALTER TABLE site_access REPLACE PARTITION (p1) WITH TEMPORARY PARTITION (tp1);

Заменить формальные партиции p2 и p3 временными tp2 и tp3:

ALTER TABLE site_access REPLACE PARTITION (p2, p3) WITH TEMPORARY PARTITION (tp2, tp3);

Заменить p4 и p5 на tp4 и tp5, указав strict_range=false и use_temp_partition_name=true:

ALTER TABLE site_access REPLACE PARTITION (p4, p5) WITH TEMPORARY PARTITION (tp4, tp5)
PROPERTIES (
    "strict_range" = "false",
    "use_temp_partition_name" = "true"
);

Примечания по использованию

  • Если у таблицы есть временные партиции, оператором ALTER нельзя выполнять Schema Change для этой таблицы.

  • При выполнении Schema Change нельзя добавлять временные партиции.

Удаление временных партиций

Удалить временную партицию tp1:

ALTER TABLE site_access DROP TEMPORARY PARTITION tp1;

Ограничения:

  • При удалении базы или таблицы командой DROP их можно восстановить в течение ограниченного времени командой RECOVER. Временные партиции не восстанавливаются.

  • При удалении формальной партиции через ALTER её можно восстановить RECOVER. Операции с временными партициями не затрагивают формальные.

  • Временные партиции, удалённые ALTER, восстановить командой RECOVER нельзя.

  • При TRUNCATE всей таблицы временные партиции удаляются без возможности восстановления.

  • При TRUNCATE формальной партиции временные партиции не затрагиваются.

  • Командой TRUNCATE нельзя удалять данные во временной партиции.