Doris系列10-数据导入之Insert into

一. Insert into 概述

Insert Into 语句的使用方式和 MySQL 等数据库中 Insert Into 语句的使用方式类似。但在 Doris 中,所有的数据写入都是一个独立的导入作业。所以这里将 Insert Into 也作为一种导入方式介绍。

主要的 Insert Into 命令包含以下两种:

  1. INSERT INTO tbl SELECT …
  2. INSERT INTO tbl (col1, col2, …) VALUES (1, 2, …), (1,3, …);

其中第二种命令仅用于 Demo,不要使用在测试或生产环境中。

语法:

INSERT INTO table_name [partition_info] [WITH LABEL label] [col_list] [query_stmt] [VALUES];
  1. partition_info
    导入表的目标分区,如果指定目标分区,则只会导入符合目标分区的数据。如果没有指定,则默认值为这张表的所有分区。

  2. col_list
    导入表的目标列,可以以任意的顺序存在。如果没有指定目标列,那么默认值是这张表的所有列。如果待表中的某个列没有存在目标列中,那么这个列需要有默认值,否则 Insert Into 就会执行失败。
    如果查询语句的结果列类型与目标列的类型不一致,那么会调用隐式类型转化,如果不能够进行转化,那么 Insert Into 语句会报语法解析错误。

  3. query_stmt
    通过一个查询语句,将查询语句的结果导入到 Doris 系统中的其他表。查询语句支持任意 Doris 支持的 SQL 查询语法。

  4. VALUES
    用户可以通过 VALUES 语法插入一条或者多条数据。
    注意:VALUES 方式仅适用于导入几条数据作为导入 DEMO 的情况,完全不适用于任何测试和生产环境。Doris 系统本身也不适合单条数据导入的场景。建议使用 INSERT INTO SELECT 的方式进行批量导入。

  5. WITH LABEL
    INSERT 操作作为一个导入任务,也可以指定一个 label。如果不指定,则系统会自动指定一个 UUID 作为 label。

CTE
insert into 支持with语句

INSERT INTO tbl1 WITH LABEL label1
WITH cte1 AS (SELECT * FROM tbl1), cte2 AS (SELECT * FROM tbl2)
SELECT k1 FROM cte1 JOIN cte2 WHERE cte1.k1 = 1;


INSERT INTO tbl1 (k1)
WITH cte1 AS (SELECT * FROM tbl1), cte2 AS (SELECT * FROM tbl2)
SELECT k1 FROM cte1 JOIN cte2 WHERE cte1.k1 = 1;

二. 相关系统配置

2.1 FE 配置

timeout
导入任务的超时时间(以秒为单位),导入任务在设定的 timeout 时间内未完成则会被系统取消,变成 CANCELLED。

目前 Insert Into 并不支持自定义导入的 timeout 时间,所有 Insert Into 导入的超时时间是统一的,默认的 timeout 时间为1小时。如果导入的源文件无法再规定时间内完成导入,则需要调整 FE 的参数insert_load_default_timeout_second。

同时 Insert Into 语句收到 Session 变量 query_timeout 的限制。可以通过 SET query_timeout = xxx; 来增加超时时间,单位是秒。

2.2 Session 变量

enable_insert_strict:
Insert Into 导入本身不能控制导入可容忍的错误率。用户只能通过 enable_insert_strict 这个 Session 参数用来控制。

当该参数设置为 false 时,表示至少有一条数据被正确导入,则返回成功。如果有失败数据,则还会返回一个 Label。

当该参数设置为 true 时,表示如果有一条数据错误,则导入失败。

默认为 false。可通过 SET enable_insert_strict = true; 来设置。

query_timeout
Insert Into 本身也是一个 SQL 命令,因此 Insert Into 语句也受到 Session 变量 query_timeout 的限制。可以通过 SET query_timeout = xxx; 来增加超时时间,单位是秒。

三. Insert 实例

理论上数据量没有限制,但是要修改session的 query_timeout参数,具体可以参考10M/S 这个速度来设置。

mysql> create table ods_fact_sale like table3; 
Query OK, 0 rows affected (0.02 sec)

mysql> show create table ods_fact_sale\G
*************************** 1. row ***************************
       Table: ods_fact_sale
Create Table: CREATE TABLE `ods_fact_sale` (
  `id` bigint(20) NULL COMMENT "",
  `sale_date` varchar(100) NULL COMMENT "",
  `prod_name` varchar(32) NULL COMMENT "",
  `sale_nums` bigint(20) SUM NULL DEFAULT "0" COMMENT ""
) ENGINE=OLAP
AGGREGATE KEY(`id`, `sale_date`, `prod_name`)
COMMENT "OLAP"
DISTRIBUTED BY HASH(`id`) BUCKETS 10
PROPERTIES (
"replication_allocation" = "tag.location.default: 1",
"in_memory" = "false",
"storage_format" = "V2"
)
1 row in set (0.00 sec)

mysql> 
mysql> select count(*) from table3;
+-----------+
| count(*)  |
+-----------+
| 767830000 |
+-----------+
1 row in set (18.87 sec)

mysql> 
mysql> show variables like 'query_timeout';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| query_timeout | 300   |
+---------------+-------+
1 row in set (0.01 sec)

mysql> 
mysql> insert into ods_fact_sale select * from table3;
ERROR 1105 (HY000): errCode = 2, detailMessage = Execute timeout
mysql> 
mysql> 
mysql> 
mysql> set query_timeout = 3000;
Query OK, 0 rows affected (0.00 sec)

mysql> insert into ods_fact_sale select * from table3;
Query OK, 767830000 rows affected (18 min 31.45 sec)
{'label':'insert_d3f9a8d958c6498c-8767ad465c5d292b', 'status':'VISIBLE', 'txnId':'2119'}

参考:

  1. https://doris.apache.org/master/zh-CN/administrator-guide/load-data/insert-into-manual.html
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值