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

INSERT

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

Вы можете отправить асинхронную задачу INSERT, используя SUBMIT TASK.

Синтаксис

  • Загрузка данных:

    INSERT { INTO | OVERWRITE } [db_name.]<table_name>
    [ PARTITION (<partition_name> [, ...] ) ]
    [ TEMPORARY PARTITION (<temporary_partition_name> [, ...] ) ]
    [ WITH LABEL <label>]
    [ (<column_name>[, ...]) ]
    { VALUES ( { <expression> | DEFAULT } [, ...] ) | <query> }
  • Выгрузка данных:

    INSERT INTO FILES()
    [ WITH LABEL <label> ]
    { VALUES ( { <expression> | DEFAULT } [, ...] ) | <query> }

Параметры

ПараметрОписание
INTOДля добавления данных в таблицу.
OVERWRITEДля перезаписи таблицы данными.
table_nameИмя таблицы, в которую вы хотите загрузить данные. Может быть указано с базой данных, в которой находится таблица, как db_name.table_name.
PARTITIONРазделы, в которые вы хотите загрузить данные. Вы можете указать несколько разделов, которые должны быть разделены запятыми (,). Должны быть установлены разделы, которые существуют в целевой таблице. Если вы укажете этот параметр, данные будут вставлены только в указанные разделы. Если вы не укажете этот параметр, данные будут вставлены во все разделы.
TEMPORARY PARTITIONИмя временного раздела, в который вы хотите загрузить данные. Вы можете указать несколько временных разделов, которые должны быть разделены запятыми (,).
labelУникальная идентификационная метка для каждой транзакции загрузки данных в базе данных. Если она не указана, система автоматически генерирует ее для транзакции. Мы рекомендуем указывать метку для транзакции. В противном случае вы не сможете проверить статус транзакции, если произойдет ошибка соединения и результат не будет возвращен. Вы можете проверить статус транзакции с помощью оператора SHOW LOAD WHERE label="label". Для соглашений об именовании меток см. Системные ограничения.
column_nameИмя целевого столбца(ов) для загрузки данных. Должно быть установлено как столбцы, которые существуют в целевой таблице. Указанные вами целевые столбцы сопоставляются один к одному в последовательности со столбцами исходной таблицы, независимо от того, какие имена целевых столбцов. Если целевой столбец не указан, значением по умолчанию являются все столбцы в целевой таблице. Если указанный столбец в исходной таблице не существует в целевом столбце, в этот столбец будет записано значение по умолчанию, и транзакция завершится неудачей, если указанный столбец не имеет значения по умолчанию. Если тип столбца исходной таблицы не соответствует типу целевой таблицы, система выполнит неявное преобразование несоответствующего столбца. Если преобразование не удается, будет возвращена ошибка синтаксического анализа.
ПРИМЕЧАНИЕ
Начиная с версии 1.5.0, указание списка столбцов в операторе INSERT INTO для таблицы Primary Key будет выполнять частичные обновления (вместо полного Upsert в более ранних версиях). Если список столбцов не указан, система будет выполнять полный Upsert.
expressionВыражение, которое присваивает значения столбцу.
DEFAULTПрисваивает значение по умолчанию столбцу.
queryОператор запроса, результат которого будет загружен в целевую таблицу. Это может быть любой SQL-оператор, поддерживаемый Selena.
FILES()Табличная функция FILES(). Вы можете использовать эту функцию для выгрузки данных в удаленное хранилище.

Возвращаемое значение

Query OK, 5 rows affected, 2 warnings (0.05 sec)
{'label':'insert_load_test', 'status':'VISIBLE', 'txnId':'1008'}
Возвращаемое значениеОписание
rows affectedУказывает, сколько строк загружено. warnings указывает строки, которые были отфильтрованы.
labelУникальная идентификационная метка для каждой транзакции загрузки данных в базе данных. Может быть назначена пользователем или автоматически системой.
statusУказывает, видны ли загруженные данные. VISIBLE: данные успешно загружены и видны. COMMITTED: данные успешно загружены, но пока невидимы.
txnIdИдентификационный номер, соответствующий каждой транзакции INSERT.

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

  • Что касается текущей версии, когда Selena выполняет оператор INSERT INTO, если какая-либо строка данных не соответствует формату целевой таблицы (например, строка слишком длинная), транзакция INSERT по умолчанию завершается неудачей. Вы можете установить переменную сеанса enable_insert_strict в false, чтобы система отфильтровывала данные, которые не соответствуют формату целевой таблицы, и продолжала выполнение транзакции.

  • После выполнения оператора INSERT OVERWRITE Selena создает временные разделы для разделов, которые хранят исходные данные, вставляет данные во временные разделы и меняет местами исходные разделы с временными разделами. Все эти операции выполняются в узле Leader FE. Поэтому, если узел Leader FE аварийно завершает работу во время выполнения оператора INSERT OVERWRITE, вся транзакция загрузки завершается неудачей, и временные разделы удаляются.

Пример

Следующие примеры основаны на таблице test, которая содержит два столбца c1 и c2. Столбец c2 имеет значение по умолчанию DEFAULT.

  • Импорт одной строки данных в таблицу test.
INSERT INTO test VALUES (1, 2);
INSERT INTO test (c1, c2) VALUES (1, 2);
INSERT INTO test (c1, c2) VALUES (1, DEFAULT);
INSERT INTO test (c1) VALUES (1);

Когда целевой столбец не указан, столбцы по умолчанию загружаются последовательно в целевую таблицу. Поэтому в приведенном выше примере результаты первого и второго SQL-операторов одинаковы.

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

  • Загрузка нескольких строк данных в таблицу test одновременно.
INSERT INTO test VALUES (1, 2), (3, 2 + 2);
INSERT INTO test (c1, c2) VALUES (1, 2), (3, 2 * 2);
INSERT INTO test (c1, c2) VALUES (1, DEFAULT), (3, DEFAULT);
INSERT INTO test (c1) VALUES (1), (3);

Поскольку результаты выражений эквивалентны, результаты первого и второго операторов одинаковы. Результаты третьего и четвертого операторов одинаковы, поскольку они оба используют значение по умолчанию.

  • Импорт результата оператора запроса в таблицу test.
INSERT INTO test SELECT * FROM test2;
INSERT INTO test (c1, c2) SELECT * from test2;
  • Импорт результата запроса в таблицу test с указанием раздела и метки.
INSERT INTO test PARTITION(p1, p2) WITH LABEL `label1` SELECT * FROM test2;
INSERT INTO test WITH LABEL `label1` (c1, c2) SELECT * from test2;
  • Перезапись таблицы test результатом запроса с указанием раздела и метки.
INSERT OVERWRITE test PARTITION(p1, p2) WITH LABEL `label1` SELECT * FROM test3;
INSERT OVERWRITE test WITH LABEL `label1` (c1, c2) SELECT * from test3;

Следующий пример вставляет строки данных из файла 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" = "ap-southeast-1"
);