ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2022-01-09 11:01:10  阅读:220  来源: 互联网

标签:10 Insert into 导入 timeout mysql query 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

标签:10,Insert,into,导入,timeout,mysql,query,Into
来源: https://blog.csdn.net/u010520724/article/details/122390904

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有