You need to enable JavaScript to run this app.
导航
Insert方式 导入
最近更新时间:2024.02.18 19:03:44首次发布时间:2024.01.15 15:23:16

本文介绍如何使用 INSERT 语句向 StarRocks 导入数据。本文图片和内容来源于开源StarRocks的通过 INSERT 语句导入数据章节。

1 适用场景

  • INSERT导入会同步返回导入的运行结果。

  • 若有数据有不符合目标表格式,则执行 INSERT 语句时会执行失败。设置会话变量 enable_insert_strictfalse, 将过滤不符合目标表格式的数据,并继续执行IINSERT动作。

  • 频繁使用 INSERT 语句导入小批量数据会产生过多的数据版本,从而影响查询性能。因此不建议您频繁使用 INSERT 语句导入数据或将其作为生产环境的日常例行导入作业。如果仅导入几条测试数据,验证一下StarRocks系统的功能,则可以使用INSERT INTO VALUES语句。

  • 如果将StarRocks中经过ETL转换后的数据导入到新的StarRocks表中,则可以使用INSERT INTO SELECT语句。

  • 执行 INSERT OVERWRITE 语句后,系统将为目标分区创建相应的临时分区,并将数据写入临时分区,最后使用临时分区原子替换目标分区来实现覆盖写入。其所有过程均在 Leader FE 节点执行。因此,如果 Leader FE 节点在覆盖写入过程中发生宕机,将会导致该次 INSERT OVERWRITE 导入失败,其过程中所创建的临时分区也会被删除。

2 基本操作

2.1 语法

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。
建议您指定 Label。否则,如果当前导入作业因网络错误无法返回结果,您将无法得知该导入操作是否成功。如果指定了 Label,可以通过Label查看任务结果。

column_name

导入的目标列,必须是目标表中存在的列。
该参数的对应关系与列名无关,但与其顺序一一对应。如果不指定目标列,默认为目标表中的所有列。如果源表中的某个列在目标列不存在,则写入默认值。如果当前列没有默认值,导入作业会失败。如果查询语句的结果列类型与目标列的类型不一致,会进行隐式转化,如果不能进行转化,那么 INSERT INTO 语句会报语法解析错误。

expression表达式,用于为对应列赋值。
DEFAULT为对应列赋予默认值。
query查询语句,查询的结果会导入至目标表中。查询语句支持任意 StarRocks 支持的 SQL 查询语法。

2.2 导入结果介绍

执行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 将返回相应错误以及 tracking_url。您可以通过 tracking_url 查看错误相关的日志信息并排查问题。
如: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

说明 行存表的返回结果中没有lable关键字。

3 相关配置

  • FE配置

    FE 配置项说明

    insert_load_default_timeout_second

    INSERT 导入作业的超时时间,单位为秒。默认为 3600 秒(1 小时)
    如果当前 INSERT 导入作业在该参数设定的时间内未完成则会被系统取消,状态为 CANCELLED。目前仅支持通过该参数为所有 INSERT 导入作业统一设定超时时间,不支持为单独的导入作业设置超时时间。如果导入作业无法在规定时间内完成,您可以通过调整该参数延长超时时间。

  • Session变量

    Session 变量说明

    enable_insert_strict

    INSERT 导入是否容忍错误数据行。该参数默认为 true
    设置为 true 时,如果有一条数据错误,则返回导入失败。设置为 false 时,如果至少有一条数据被正确导入,则返回导入成功,并会返回一个 Label。您可以通过 SET enable_insert_strict = {true or false}; 命令来设定该参数。

    query_timeout

    SQL 命令的超时时间,单位为秒。
    INSERT 语句作为 SQL 命令,同样受到该 Session 变量的限制。您可以通过 SET query_timeout = xxx; 命令来设定该参数。

4 导入示例

这里介绍下行存表数据导入列存表中的示例。

  1. 执行以下命令,创建数据库和行存表。
--创建行存表
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);
  1. 导入几条数据进行验证数据
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;
  1. 创建列存表
-- 创建列存表,并导入一些测试数据
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;
  1. 创建导入任务
INSERT INTO demo.column_store_table WITH LABEL insert_column_store_load SELECT * FROM  demo.row_store_table;
  1. 查看列存表数据
SELECT * FROM demo.column_store_table;