本文介绍如何使用 INSERT 语句向 StarRocks 导入数据。本文图片和内容来源于开源StarRocks的通过 INSERT 语句导入数据章节。
INSERT导入会同步返回导入的运行结果。
若有数据有不符合目标表格式,则执行 INSERT 语句时会执行失败。设置会话变量 enable_insert_strict
为 false
, 将过滤不符合目标表格式的数据,并继续执行IINSERT动作。
频繁使用 INSERT 语句导入小批量数据会产生过多的数据版本,从而影响查询性能。因此不建议您频繁使用 INSERT 语句导入数据或将其作为生产环境的日常例行导入作业。如果仅导入几条测试数据,验证一下StarRocks系统的功能,则可以使用INSERT INTO VALUES语句。
如果将StarRocks中经过ETL转换后的数据导入到新的StarRocks表中,则可以使用INSERT INTO SELECT语句。
执行 INSERT OVERWRITE 语句后,系统将为目标分区创建相应的临时分区,并将数据写入临时分区,最后使用临时分区原子替换目标分区来实现覆盖写入。其所有过程均在 Leader FE 节点执行。因此,如果 Leader FE 节点在覆盖写入过程中发生宕机,将会导致该次 INSERT OVERWRITE 导入失败,其过程中所创建的临时分区也会被删除。
INSERT { INTO | OVERWRITE } [db_name.]<table_name> [ PARTITION (<partition_name> [, ...) ] [ TEMPORARY_PARTITION (<temporary_partition_name>[, ...) ] [ WITH LABEL <label>] [ (<column_name>[, ...]) ] { VALUES ( { <expression> | DEFAULT }[, ...] ) | <query> }
参数说明如下,也可以参考官网:
参数 | 说明 |
---|---|
PARTITION | 导入的目标分区,多个分区名称用逗号(,)分隔。 |
label | 导入作业的标识,数据库内唯一。如果未指定,StarRocks 会自动为作业生成一个 Label。 |
column_name | 导入的目标列,必须是目标表中存在的列。 |
expression | 表达式,用于为对应列赋值。 |
DEFAULT | 为对应列赋予默认值。 |
query | 查询语句,查询的结果会导入至目标表中。查询语句支持任意 StarRocks 支持的 SQL 查询语法。 |
执行Insert导入语句后,会同步返回结果,如下:
Query OK, 7 rows affected (0.044 sec) {'label':'my_lable', 'status':'VISIBLE', 'txnId':'43864'}
参数描述如下:
参数 | 描述 |
---|---|
rows affected | 表示总共有多少行数据被导入。warnings 表示被过滤的行数。 |
label | 用户指定或自动生成的 Label。Label 是该 INSERT 导入作业的标识,当前数据库内唯一。 |
status | 表示导入数据是否可见。VISIBLE 表示可见,COMMITTED 表示已提交但暂不可见。 |
txnId | 该 INSERT 导入对应的导入事务 ID。 |
err | 导入执行失败时,StarRocks 将返回相应错误以及 |
说明 行存表的返回结果中没有lable关键字。
FE配置
FE 配置项 | 说明 |
---|---|
insert_load_default_timeout_second | INSERT 导入作业的超时时间,单位为秒。默认为 3600 秒(1 小时) |
Session变量
Session 变量 | 说明 |
---|---|
enable_insert_strict | INSERT 导入是否容忍错误数据行。该参数默认为 |
query_timeout | SQL 命令的超时时间,单位为秒。 |
这里介绍下行存表数据导入列存表中的示例。
--创建行存表 CREATE DATABASE IF NOT EXISTS demo; CREATE TABLE IF NOT EXISTS demo.row_store_table( k1 int, k2 int, v1 varchar(16), v2 DATE NOT NULL COMMENT "YYYY-MM-DD", v3 TINYINT COMMENT "range [-128, 127]" ) ENGINE=ROW_STORE PRIMARY KEY (k1, k2);
INSERT INTO demo.row_store_table(k1, k2, v1, v2, v3) VALUES (1, 2, 'a', "2222-12-22", 33), (1, 3, 'b', "2222-12-22", 34), (1, 4, 'c', "2222-12-22", 35), (2, 2, 'd', "2222-12-22", 36), (2, 3, 'd', "2222-12-22", 37), (3, 3, 'e', "2222-12-22", 100), (4, 4, 'f', "2222-12-22", 101); SELECT * FROM demo.row_store_table;
-- 创建列存表,并导入一些测试数据 CREATE TABLE IF NOT EXISTS demo.column_store_table( k1 int, k2 int, v1 varchar(16), v2 DATE NOT NULL COMMENT "YYYY-MM-DD", v3 TINYINT COMMENT "range [-128, 127]" ) DISTRIBUTED BY HASH(k1, k2) BUCKETS 3;
INSERT INTO demo.column_store_table WITH LABEL insert_column_store_load SELECT * FROM demo.row_store_table;
SELECT * FROM demo.column_store_table;