Перейти к основному содержимому

Временные разделы

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

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

Вы можете использовать функцию временных разделов в следующих сценариях:

  • Операция атомарной перезаписи

    Если вам нужно переписать данные в разделе, обеспечивая при этом возможность запроса данных во время процесса перезаписи, вы можете сначала создать временный раздел на основе исходного формального раздела и загрузить новые данные во временный раздел. Затем вы можете использовать операцию замены для атомарной замены исходного формального раздела временным разделом. Для операций атомарной перезаписи в несекционированных таблицах см. 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 (...). Selena использует верхнюю границу предыдущего временного раздела как нижнюю границу этого временного раздела, создавая временный раздел с левозамкнутым и правооткрытым диапазоном [2020-02-01, 2020-03-01).

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

Создайте временный раздел tp3 в таблице site_access, укажите его верхнюю границу как 2020-04-01, используя синтаксис VALUES LESS THAN (...), и укажите количество реплик как 1.

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

Создайте несколько разделов одновременно в таблице site_access, используя синтаксис 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,...);

Для подробного синтаксиса и описания параметров см. INSERT INTO.

Загрузка данных с помощью 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

Для подробного синтаксиса и описания параметров см. 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 представляет группу параметров аутентификации, которые различаются в зависимости от выбранного метода аутентификации. Для подробного синтаксиса и описания параметров см. Broker Load.

Загрузка данных с помощью 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"
);

Для подробного синтаксиса и описания параметров см. CREATE ROUTINE LOAD.

Запрос данных во временных разделах

Вы можете использовать оператор 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. Если значение установлено в 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.

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

    В следующем примере имя раздела нового формального раздела остается p1 после замены, когда этот параметр установлен в false. Однако его связанные данные и свойства заменяются данными и свойствами временного раздела tp1. Когда этот параметр установлен в true, имя раздела нового формального раздела изменяется на tp1 после замены. Исходный формальный раздел p1 больше не существует.

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

    Если количество формальных разделов, подлежащих замене, отличается от количества временных разделов, используемых для замены, и этот параметр остается со значением по умолчанию false, значение 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 не может использоваться для удаления данных во временном разделе.