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

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

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

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

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

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

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

  • Корректировка параллелизма запросов данных партиции

    Если вам нужно изменить количество bucket'ов для партиции, вы можете сначала создать временную партицию с тем же диапазоном партиции, что и оригинальная формальная партиция, и указать новое количество bucket'ов. Затем вы можете использовать команду 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: определяет количество bucket'ов и свойства для временных партиций, такие как количество реплик и носитель хранения.

Примеры

Создайте временную партицию 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/selena/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 не может использоваться для удаления данных во временной партиции.