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

Загрузка данных с помощью INSERT

Эта тема описывает, как загружать данные в Selena с помощью SQL-оператора - INSERT.

Подобно MySQL и многим другим системам управления базами данных, Selena поддерживает загрузку данных во внутреннюю таблицу с помощью INSERT. Вы можете вставить одну или несколько строк напрямую с помощью предложения VALUES для тестирования функции или DEMO. Вы также можете вставить данные, определенные результатами запроса, во внутреннюю таблицу из внешней таблицы. Начиная с Selena v3.1, вы можете напрямую загружать данные из файлов в облачном хранилище, используя команду INSERT и табличную функцию FILES().

Selena v2.4 дополнительно поддерживает перезапись данных в таблицу с помощью INSERT OVERWRITE. Оператор INSERT OVERWRITE интегрирует следующие операции для реализации функции перезаписи:

  1. Создает временные разделы в соответствии с разделами, которые хранят исходные данные.
  2. Вставляет данные во временные разделы.
  3. Меняет местами исходные разделы с временными разделами.

ПРИМЕЧАНИЕ

Если вам нужно проверить данные перед их перезаписью, вместо использования INSERT OVERWRITE вы можете следовать приведенным выше процедурам для перезаписи ваших данных и проверки их перед заменой разделов.

Меры предосторожности

  • Вы можете отменить синхронную транзакцию INSERT только нажав клавиши Ctrl и C в вашем MySQL-клиенте.
  • Вы можете отправить асинхронную задачу INSERT, используя SUBMIT TASK.
  • Что касается текущей версии Selena, транзакция INSERT по умолчанию завершается неудачей, если данные любых строк не соответствуют схеме таблицы. Например, транзакция INSERT завершается неудачей, если длина поля в любой строке превышает ограничение длины для соответствующего поля в таблице. Вы можете установить переменную сессии enable_insert_strict в false, чтобы позволить транзакции продолжиться, отфильтровав строки, которые не соответствуют таблице.
  • Если вы часто выполняете оператор INSERT для загрузки небольших пакетов данных в Selena, генерируется чрезмерное количество версий данных. Это серьезно влияет на производительность запросов. Мы рекомендуем, чтобы в продакшене вы не загружали данные с помощью команды INSERT слишком часто или не использовали ее как рутину для ежедневной загрузки данных. Если ваше приложение или аналитический сценарий требует решений для загрузки потоковых данных или небольших пакетов данных отдельно, мы рекомендуем использовать Apache Kafka® в качестве источника данных и загружать данные через Routine Load.
  • Если вы выполняете оператор INSERT OVERWRITE, Selena создает временные разделы для разделов, которые хранят исходные данные, вставляет новые данные во временные разделы и меняет местами исходные разделы с временными разделами. Все эти операции выполняются в узле Leader FE. Следовательно, если узел Leader FE выходит из строя во время выполнения команды INSERT OVERWRITE, вся транзакция загрузки завершится неудачей, и временные разделы будут усечены.

Подготовка

Проверка привилегий

Вы можете загружать данные в таблицы Selena только как пользователь, имеющий привилегию INSERT на эти таблицы Selena. Если у вас нет привилегии INSERT, следуйте инструкциям в GRANT, чтобы предоставить привилегию INSERT пользователю, которого вы используете для подключения к вашему кластеру Selena. Синтаксис: GRANT INSERT ON TABLE <table_name> IN DATABASE <database_name> TO { ROLE <role_name> | USER <user_identity>}.

Создание объектов

Создайте базу данных с именем load_test, и создайте таблицу insert_wiki_edit как целевую таблицу и таблицу source_wiki_edit как исходную таблицу.

ПРИМЕЧАНИЕ

Примеры, продемонстрированные в этой теме, основаны на таблице insert_wiki_edit и таблице source_wiki_edit. Если вы предпочитаете работать с собственными таблицами и данными, вы можете пропустить подготовку и перейти к следующему шагу.

CREATE DATABASE IF NOT EXISTS load_test;
USE load_test;
CREATE TABLE insert_wiki_edit
(
event_time DATETIME,
channel VARCHAR(32) DEFAULT '',
user VARCHAR(128) DEFAULT '',
is_anonymous TINYINT DEFAULT '0',
is_minor TINYINT DEFAULT '0',
is_new TINYINT DEFAULT '0',
is_robot TINYINT DEFAULT '0',
is_unpatrolled TINYINT DEFAULT '0',
delta INT DEFAULT '0',
added INT DEFAULT '0',
deleted INT DEFAULT '0'
)
DUPLICATE KEY(
event_time,
channel,
user,
is_anonymous,
is_minor,
is_new,
is_robot,
is_unpatrolled
)
PARTITION BY RANGE(event_time)(
PARTITION p06 VALUES LESS THAN ('2015-09-12 06:00:00'),
PARTITION p12 VALUES LESS THAN ('2015-09-12 12:00:00'),
PARTITION p18 VALUES LESS THAN ('2015-09-12 18:00:00'),
PARTITION p24 VALUES LESS THAN ('2015-09-13 00:00:00')
)
DISTRIBUTED BY HASH(user);

CREATE TABLE source_wiki_edit
(
event_time DATETIME,
channel VARCHAR(32) DEFAULT '',
user VARCHAR(128) DEFAULT '',
is_anonymous TINYINT DEFAULT '0',
is_minor TINYINT DEFAULT '0',
is_new TINYINT DEFAULT '0',
is_robot TINYINT DEFAULT '0',
is_unpatrolled TINYINT DEFAULT '0',
delta INT DEFAULT '0',
added INT DEFAULT '0',
deleted INT DEFAULT '0'
)
DUPLICATE KEY(
event_time,
channel,user,
is_anonymous,
is_minor,
is_new,
is_robot,
is_unpatrolled
)
PARTITION BY RANGE(event_time)(
PARTITION p06 VALUES LESS THAN ('2015-09-12 06:00:00'),
PARTITION p12 VALUES LESS THAN ('2015-09-12 12:00:00'),
PARTITION p18 VALUES LESS THAN ('2015-09-12 18:00:00'),
PARTITION p24 VALUES LESS THAN ('2015-09-13 00:00:00')
)
DISTRIBUTED BY HASH(user);

УВЕДОМЛЕНИЕ

Начиная с v2.5.7, Selena может автоматически устанавливать количество корзин (BUCKETS) при создании таблицы или добавлении раздела. Вам больше не нужно вручную устанавливать количество корзин. Для получения подробной информации см. установка количества корзин.

Вставка данных через INSERT INTO VALUES

Вы можете добавить одну или несколько строк в определенную таблицу, используя команду INSERT INTO VALUES. Несколько строк разделяются запятой (,). Для получения подробных инструкций и справочной информации о параметрах см. SQL Reference - INSERT.

ВНИМАНИЕ

Вставка данных через INSERT INTO VALUES применима только к ситуации, когда вам нужно проверить DEMO с небольшим набором данных. Это не рекомендуется для массового тестирования или продакшен-среды. Для загрузки массовых данных в Selena см. Варианты загрузки для других вариантов, которые подходят вашим сценариям.

Следующий пример вставляет две строки в исходную таблицу данных source_wiki_edit с меткой insert_load_wikipedia. Метка - это уникальная идентификационная метка для каждой транзакции загрузки данных в базе данных.

INSERT INTO source_wiki_edit
WITH LABEL insert_load_wikipedia
VALUES
("2015-09-12 00:00:00","#en.wikipedia","AustinFF",0,0,0,0,0,21,5,0),
("2015-09-12 00:00:00","#ca.wikipedia","helloSR",0,1,0,1,0,3,23,0);

Вставка данных через INSERT INTO SELECT

Вы можете загрузить результат запроса к исходной таблице данных в целевую таблицу через команду INSERT INTO SELECT. Команда INSERT INTO SELECT выполняет ETL-операции с данными из исходной таблицы данных и загружает данные во внутреннюю таблицу в Selena. Источником данных может быть одна или несколько внутренних или внешних таблиц, или даже файлы данных в облачном хранилище. Целевая таблица ДОЛЖНА быть внутренней таблицей в Selena. Для получения подробных инструкций и справочной информации о параметрах см. SQL Reference - INSERT.

Вставка данных из внутренней или внешней таблицы во внутреннюю таблицу

ПРИМЕЧАНИЕ

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

  • Следующий пример вставляет данные из исходной таблицы в целевую таблицу insert_wiki_edit.
INSERT INTO insert_wiki_edit
WITH LABEL insert_load_wikipedia_1
SELECT * FROM source_wiki_edit;
  • Следующий пример вставляет данные из исходной таблицы в разделы p06 и p12 целевой таблицы insert_wiki_edit. Если раздел не указан, данные будут вставлены во все разделы. В противном случае данные будут вставлены только в указанный раздел(ы).
INSERT INTO insert_wiki_edit PARTITION(p06, p12)
WITH LABEL insert_load_wikipedia_2
SELECT * FROM source_wiki_edit;

Запросите целевую таблицу, чтобы убедиться, что в ней есть данные.

MySQL > select * from insert_wiki_edit;
+---------------------+---------------+----------+--------------+----------+--------+----------+----------------+-------+-------+---------+
| event_time | channel | user | is_anonymous | is_minor | is_new | is_robot | is_unpatrolled | delta | added | deleted |
+---------------------+---------------+----------+--------------+----------+--------+----------+----------------+-------+-------+---------+
| 2015-09-12 00:00:00 | #en.wikipedia | AustinFF | 0 | 0 | 0 | 0 | 0 | 21 | 5 | 0 |
| 2015-09-12 00:00:00 | #ca.wikipedia | helloSR | 0 | 1 | 0 | 1 | 0 | 3 | 23 | 0 |
+---------------------+---------------+----------+--------------+----------+--------+----------+----------------+-------+-------+---------+
2 rows in set (0.00 sec)

Если вы усечете разделы p06 и p12, данные не будут возвращены в запросе.

MySQL > TRUNCATE TABLE insert_wiki_edit PARTITION(p06, p12);
Query OK, 0 rows affected (0.01 sec)

MySQL > select * from insert_wiki_edit;
Empty set (0.00 sec)
  • Следующий пример вставляет столбцы event_time и channel из исходной таблицы в целевую таблицу insert_wiki_edit. Значения по умолчанию используются в столбцах, которые здесь не указаны.
INSERT INTO insert_wiki_edit
WITH LABEL insert_load_wikipedia_3
(
event_time,
channel
)
SELECT event_time, channel FROM source_wiki_edit;
примечание

Начиная с v3.3.1, указание списка столбцов в операторе INSERT INTO для таблицы Primary Key будет выполнять частичные обновления (вместо полного Upsert в более ранних версиях). Если список столбцов не указан, система будет выполнять полный Upsert.

Вставка данных напрямую из файлов во внешнем источнике с помощью FILES()

Начиная с v3.1, Selena поддерживает прямую загрузку данных из файлов в облачном хранилище, используя команду INSERT и функцию FILES(), тем самым вам не нужно сначала создавать external catalog или внешнюю файловую таблицу. Кроме того, FILES() может автоматически определять схему таблицы файлов, значительно упрощая процесс загрузки данных.

Следующий пример вставляет строки данных из Parquet-файла parquet/insert_wiki_edit_append.parquet в корзине AWS S3 inserttest в таблицу insert_wiki_edit:

INSERT INTO insert_wiki_edit
SELECT * FROM FILES(
"path" = "s3://inserttest/parquet/insert_wiki_edit_append.parquet",
"format" = "parquet",
"aws.s3.access_key" = "XXXXXXXXXX",
"aws.s3.secret_key" = "YYYYYYYYYY",
"aws.s3.region" = "us-west-2"
);

Перезапись данных через INSERT OVERWRITE VALUES

Вы можете перезаписать определенную таблицу одной или несколькими строками, используя команду INSERT OVERWRITE VALUES. Несколько строк разделяются запятой (,). Для получения подробных инструкций и справочной информации о параметрах см. SQL Reference - INSERT.

ВНИМАНИЕ

Перезапись данных через INSERT OVERWRITE VALUES применима только к ситуации, когда вам нужно проверить DEMO с небольшим набором данных. Это не рекомендуется для массового тестирования или продакшен-среды. Для загрузки массовых данных в Selena см. Варианты загрузки для других вариантов, которые подходят вашим сценариям.

Запросите исходную таблицу и целевую таблицу, чтобы убедиться, что в них есть данные.

MySQL > SELECT * FROM source_wiki_edit;
+---------------------+---------------+----------+--------------+----------+--------+----------+----------------+-------+-------+---------+
| event_time | channel | user | is_anonymous | is_minor | is_new | is_robot | is_unpatrolled | delta | added | deleted |
+---------------------+---------------+----------+--------------+----------+--------+----------+----------------+-------+-------+---------+
| 2015-09-12 00:00:00 | #ca.wikipedia | helloSR | 0 | 1 | 0 | 1 | 0 | 3 | 23 | 0 |
| 2015-09-12 00:00:00 | #en.wikipedia | AustinFF | 0 | 0 | 0 | 0 | 0 | 21 | 5 | 0 |
+---------------------+---------------+----------+--------------+----------+--------+----------+----------------+-------+-------+---------+
2 rows in set (0.02 sec)

MySQL > SELECT * FROM insert_wiki_edit;
+---------------------+---------------+----------+--------------+----------+--------+----------+----------------+-------+-------+---------+
| event_time | channel | user | is_anonymous | is_minor | is_new | is_robot | is_unpatrolled | delta | added | deleted |
+---------------------+---------------+----------+--------------+----------+--------+----------+----------------+-------+-------+---------+
| 2015-09-12 00:00:00 | #ca.wikipedia | helloSR | 0 | 1 | 0 | 1 | 0 | 3 | 23 | 0 |
| 2015-09-12 00:00:00 | #en.wikipedia | AustinFF | 0 | 0 | 0 | 0 | 0 | 21 | 5 | 0 |
+---------------------+---------------+----------+--------------+----------+--------+----------+----------------+-------+-------+---------+
2 rows in set (0.01 sec)

Следующий пример перезаписывает исходную таблицу source_wiki_edit двумя новыми строками.

INSERT OVERWRITE source_wiki_edit
WITH LABEL insert_load_wikipedia_ow
VALUES
("2015-09-12 00:00:00","#cn.wikipedia","GELongstreet",0,0,0,0,0,36,36,0),
("2015-09-12 00:00:00","#fr.wikipedia","PereBot",0,1,0,1,0,17,17,0);

Перезапись данных через INSERT OVERWRITE SELECT

Вы можете перезаписать таблицу результатом запроса к исходной таблице данных через команду INSERT OVERWRITE SELECT. Оператор INSERT OVERWRITE SELECT выполняет ETL-операции с данными из одной или нескольких внутренних или внешних таблиц и перезаписывает внутреннюю таблицу данными. Для получения подробных инструкций и справочной информации о параметрах см. SQL Reference - INSERT.

ПРИМЕЧАНИЕ

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

Запросите исходную таблицу и целевую таблицу, чтобы убедиться, что они содержат разные строки данных.

MySQL > SELECT * FROM source_wiki_edit;
+---------------------+---------------+--------------+--------------+----------+--------+----------+----------------+-------+-------+---------+
| event_time | channel | user | is_anonymous | is_minor | is_new | is_robot | is_unpatrolled | delta | added | deleted |
+---------------------+---------------+--------------+--------------+----------+--------+----------+----------------+-------+-------+---------+
| 2015-09-12 00:00:00 | #cn.wikipedia | GELongstreet | 0 | 0 | 0 | 0 | 0 | 36 | 36 | 0 |
| 2015-09-12 00:00:00 | #fr.wikipedia | PereBot | 0 | 1 | 0 | 1 | 0 | 17 | 17 | 0 |
+---------------------+---------------+--------------+--------------+----------+--------+----------+----------------+-------+-------+---------+
2 rows in set (0.02 sec)

MySQL > SELECT * FROM insert_wiki_edit;
+---------------------+---------------+----------+--------------+----------+--------+----------+----------------+-------+-------+---------+
| event_time | channel | user | is_anonymous | is_minor | is_new | is_robot | is_unpatrolled | delta | added | deleted |
+---------------------+---------------+----------+--------------+----------+--------+----------+----------------+-------+-------+---------+
| 2015-09-12 00:00:00 | #en.wikipedia | AustinFF | 0 | 0 | 0 | 0 | 0 | 21 | 5 | 0 |
| 2015-09-12 00:00:00 | #ca.wikipedia | helloSR | 0 | 1 | 0 | 1 | 0 | 3 | 23 | 0 |
+---------------------+---------------+----------+--------------+----------+--------+----------+----------------+-------+-------+---------+
2 rows in set (0.01 sec)
  • Следующий пример перезаписывает таблицу insert_wiki_edit данными из исходной таблицы.
INSERT OVERWRITE insert_wiki_edit
WITH LABEL insert_load_wikipedia_ow_1
SELECT * FROM source_wiki_edit;
  • Следующий пример перезаписывает разделы p06 и p12 таблицы insert_wiki_edit данными из исходной таблицы.
INSERT OVERWRITE insert_wiki_edit PARTITION(p06, p12)
WITH LABEL insert_load_wikipedia_ow_2
SELECT * FROM source_wiki_edit;

Запросите целевую таблицу, чтобы убедиться, что в ней есть данные.

MySQL > select * from insert_wiki_edit;
+---------------------+---------------+--------------+--------------+----------+--------+----------+----------------+-------+-------+---------+
| event_time | channel | user | is_anonymous | is_minor | is_new | is_robot | is_unpatrolled | delta | added | deleted |
+---------------------+---------------+--------------+--------------+----------+--------+----------+----------------+-------+-------+---------+
| 2015-09-12 00:00:00 | #fr.wikipedia | PereBot | 0 | 1 | 0 | 1 | 0 | 17 | 17 | 0 |
| 2015-09-12 00:00:00 | #cn.wikipedia | GELongstreet | 0 | 0 | 0 | 0 | 0 | 36 | 36 | 0 |
+---------------------+---------------+--------------+--------------+----------+--------+----------+----------------+-------+-------+---------+
2 rows in set (0.01 sec)

Если вы усечете разделы p06 и p12, данные не будут возвращены в запросе.

MySQL > TRUNCATE TABLE insert_wiki_edit PARTITION(p06, p12);
Query OK, 0 rows affected (0.01 sec)

MySQL > select * from insert_wiki_edit;
Empty set (0.00 sec)
примечание

Для таблиц, которые используют стратегию PARTITION BY column, INSERT OVERWRITE поддерживает создание новых разделов в целевой таблице путем указания значения ключа раздела. Существующие разделы перезаписываются как обычно.

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

CREATE TABLE activity (
id INT NOT NULL,
dt VARCHAR(10) NOT NULL
) ENGINE=OLAP
DUPLICATE KEY(`id`)
PARTITION BY (`id`, `dt`)
DISTRIBUTED BY HASH(`id`);

INSERT OVERWRITE activity
PARTITION(id='4', dt='2022-01-01')
WITH LABEL insert_activity_auto_partition
VALUES ('4', '2022-01-01');
  • Следующий пример перезаписывает целевую таблицу insert_wiki_edit столбцами event_time и channel из исходной таблицы. Значение по умолчанию присваивается столбцам, в которые не перезаписываются данные.
INSERT OVERWRITE insert_wiki_edit
WITH LABEL insert_load_wikipedia_ow_3
(
event_time,
channel
)
SELECT event_time, channel FROM source_wiki_edit;

Вставка данных в таблицу с генерируемыми столбцами

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

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

Следующий пример создает таблицу insert_generated_columns и вставляет в нее строку. Таблица содержит два генерируемых столбца: avg_array и get_string. avg_array вычисляет среднее значение данных ARRAY в data_array, а get_string извлекает строки из JSON-пути a в data_json.

CREATE TABLE insert_generated_columns (
id INT(11) NOT NULL COMMENT "ID",
data_array ARRAY<INT(11)> NOT NULL COMMENT "ARRAY",
data_json JSON NOT NULL COMMENT "JSON",
avg_array DOUBLE NULL
AS array_avg(data_array) COMMENT "Get the average of ARRAY",
get_string VARCHAR(65533) NULL
AS get_json_string(json_string(data_json), '$.a') COMMENT "Extract JSON string"
) ENGINE=OLAP
PRIMARY KEY(id)
DISTRIBUTED BY HASH(id);

INSERT INTO insert_generated_columns
VALUES (1, [1,2], parse_json('{"a" : 1, "b" : 2}'));

ПРИМЕЧАНИЕ

Прямая загрузка данных в генерируемые столбцы не поддерживается.

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

mysql> SELECT * FROM insert_generated_columns;
+------+------------+------------------+-----------+------------+
| id | data_array | data_json | avg_array | get_string |
+------+------------+------------------+-----------+------------+
| 1 | [1,2] | {"a": 1, "b": 2} | 1.5 | 1 |
+------+------------+------------------+-----------+------------+
1 row in set (0.02 sec)

Асинхронная загрузка данных с помощью INSERT

Загрузка данных с помощью INSERT отправляет синхронную транзакцию, которая может завершиться неудачей из-за прерывания сессии или тайм-аута. Вы можете отправить асинхронную транзакцию INSERT, используя SUBMIT TASK. Эта функция поддерживается начиная с Selena v2.5.

  • Следующий пример асинхронно вставляет данные из исходной таблицы в целевую таблицу insert_wiki_edit.
SUBMIT TASK AS INSERT INTO insert_wiki_edit
SELECT * FROM source_wiki_edit;
  • Следующий пример асинхронно перезаписывает таблицу insert_wiki_edit данными из исходной таблицы.
SUBMIT TASK AS INSERT OVERWRITE insert_wiki_edit
SELECT * FROM source_wiki_edit;
  • Следующий пример асинхронно перезаписывает таблицу insert_wiki_edit данными из исходной таблицы и увеличивает тайм-аут запроса до 100000 секунд, используя подсказку.
SUBMIT /*+set_var(query_timeout=100000)*/ TASK AS
INSERT OVERWRITE insert_wiki_edit
SELECT * FROM source_wiki_edit;
  • Следующий пример асинхронно перезаписывает таблицу insert_wiki_edit данными из исходной таблицы и указывает имя задачи как async.
SUBMIT TASK async
AS INSERT OVERWRITE insert_wiki_edit
SELECT * FROM source_wiki_edit;

Вы можете проверить статус асинхронной задачи INSERT, запросив представление метаданных task_runs в Information Schema.

Следующий пример проверяет статус задачи INSERT async.

SELECT * FROM information_schema.task_runs WHERE task_name = 'async';

Проверка статуса задания INSERT

Проверка через результат

Синхронная транзакция INSERT возвращает разный статус в соответствии с результатом транзакции.

  • Транзакция успешна

Selena возвращает следующее, если транзакция успешна:

Query OK, 2 rows affected (0.05 sec)
{'label':'insert_load_wikipedia', 'status':'VISIBLE', 'txnId':'1006'}
  • Транзакция неудачна

Если все строки данных не удается загрузить в целевую таблицу, транзакция INSERT завершается неудачей. Selena возвращает следующее, если транзакция завершается неудачей:

ERROR 1064 (HY000): Insert has filtered data in strict mode, tracking_url=http://x.x.x.x:yyyy/api/_load_error_log?file=error_log_9f0a4fd0b64e11ec_906bbede076e9d08

Вы можете найти проблему, проверив журнал с помощью tracking_url.

Проверка через Information Schema

Вы можете использовать оператор SELECT для запроса результатов одного или нескольких заданий загрузки из таблицы loads в базе данных information_schema. Эта функция поддерживается начиная с v3.1.

Пример 1: Запросить результаты заданий загрузки, выполненных в базе данных load_test, отсортировать результаты по времени создания (CREATE_TIME) в убывающем порядке и вернуть только верхний результат.

SELECT * FROM information_schema.loads
WHERE database_name = 'load_test'
ORDER BY create_time DESC
LIMIT 1\G

Пример 2: Запросить результат задания загрузки (с меткой insert_load_wikipedia), выполненного в базе данных load_test:

SELECT * FROM information_schema.loads
WHERE database_name = 'load_test' and label = 'insert_load_wikipedia'\G

Возвращается следующее:

*************************** 1. row ***************************
JOB_ID: 21319
LABEL: insert_load_wikipedia
DATABASE_NAME: load_test
STATE: FINISHED
PROGRESS: ETL:100%; LOAD:100%
TYPE: INSERT
PRIORITY: NORMAL
SCAN_ROWS: 0
FILTERED_ROWS: 0
UNSELECTED_ROWS: 0
SINK_ROWS: 2
ETL_INFO:
TASK_INFO: resource:N/A; timeout(s):300; max_filter_ratio:0.0
CREATE_TIME: 2023-08-09 10:42:23
ETL_START_TIME: 2023-08-09 10:42:23
ETL_FINISH_TIME: 2023-08-09 10:42:23
LOAD_START_TIME: 2023-08-09 10:42:23
LOAD_FINISH_TIME: 2023-08-09 10:42:24
JOB_DETAILS: {"All backends":{"5ebf11b5-365e-11ee-9e4a-7a563fb695da":[10006]},"FileNumber":0,"FileSize":0,"InternalTableLoadBytes":175,"InternalTableLoadRows":2,"ScanBytes":0,"ScanRows":0,"TaskNumber":1,"Unfinished backends":{"5ebf11b5-365e-11ee-9e4a-7a563fb695da":[]}}
ERROR_MSG: NULL
TRACKING_URL: NULL
TRACKING_SQL: NULL
REJECTED_RECORD_PATH: NULL
1 row in set (0.01 sec)

Для получения информации о полях в результатах возврата см. Information Schema > loads.

Проверка через команду curl

Вы можете проверить статус транзакции INSERT, используя команду curl.

Запустите терминал и выполните следующую команду:

curl --location-trusted -u <username>:<password> \
http://<fe_address>:<fe_http_port>/api/<db_name>/_load_info?label=<label_name>

Следующий пример проверяет статус транзакции с меткой insert_load_wikipedia.

curl --location-trusted -u <username>:<password> \
http://x.x.x.x:8030/api/load_test/_load_info?label=insert_load_wikipedia

ПРИМЕЧАНИЕ

Если вы используете учетную запись, для которой не установлен пароль, вам нужно ввести только <username>:.

Возвращается следующее:

{
"jobInfo":{
"dbName":"load_test",
"tblNames":[
"source_wiki_edit"
],
"label":"insert_load_wikipedia",
"state":"FINISHED",
"failMsg":"",
"trackingUrl":""
},
"status":"OK",
"msg":"Success"
}

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

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

  • Конфигурация FE
Конфигурация FEОписание
insert_load_default_timeout_secondТайм-аут по умолчанию для транзакции INSERT. Единица: секунда. Если текущая транзакция INSERT не завершается в течение времени, установленного этим параметром, она будет отменена системой, и статус будет CANCELLED. Что касается текущей версии Selena, вы можете указать только единый тайм-аут для всех транзакций INSERT, используя этот параметр, и не можете установить разный тайм-аут для конкретной транзакции INSERT. По умолчанию 3600 секунд (1 час). Если транзакция INSERT не может быть завершена в указанное время, вы можете увеличить тайм-аут, настроив этот параметр.
  • Переменные сессии
Переменная сессииОписание
enable_insert_strictПереключатель для контроля того, является ли транзакция INSERT толерантной к недопустимым строкам данных. Когда установлено в true, транзакция завершается неудачей, если любая из строк данных недопустима. Когда установлено в false, транзакция успешна, когда по крайней мере одна строка данных была загружена правильно, и метка будет возвращена. По умолчанию true. Вы можете установить эту переменную командой SET enable_insert_strict = {true or false};.
query_timeoutТайм-аут для SQL-команд. Единица: секунда. INSERT, как SQL-команда, также ограничен этой переменной сессии. Вы можете установить эту переменную командой SET query_timeout = xxx;.