更新时间:2024-12-11 GMT+08:00

INSERT

语法

INSERT { INTO | OVERWRITE } [TABLE] table_name [(column_list)] [ PARTITION (partition_clause)] {select_statement | VALUES (value [, value ...]) [, (value [, value ...]) ...] }

FROM from_statement INSERT OVERWRITE TABLE tablename1 [PARTITION (partcol1=val1, partcol2=val2 ...)] select_statement

FROM from_statement INSERT INTO TABLE tablename1 [PARTITION (partcol1=val1, partcol2=val2 ...)] select_statement

限制

如果数据表中只有一个字段,且字段类型为row、struct,那么插入数据时需要用row对类型进行包裹。
-- 单字段表插入复杂类型需要用row()包裹
CREATE TABLE test_row (id row(c1 int, c2 string));

INSERT INTO test_row values row(row(1, 'test'));

--多字段表复杂类型可以直接插入
CREATE TABLE test_multy_value(id int, col row(c1 int, c2 string));

INSERT INTO test_multy_value values (1,row(1,'test'));

描述

  • 向表中插入新的数据行。
  • 如果指定了列名列表,那么这些列名列表必须与query语句产生列表名完全匹配。表中不在列名列表中的每一列,其值会设置为null。
  • 如果没有指定列名列表,则query语句产生的列必须与将要插入的列完全匹配。
  • 使用insert into时,会往表中追加数据,而使用insert overwrite时,如果表属性“auto.purge”被设置为“true”,直接删除原表数据,再写入新的数据。
  • 如果对象表是分区表时,insert overwrite会删除对应分区的数据而非所有数据。
  • insert into后面的table关键字为可选,以兼容hive语法。

示例

  • 创建fruit和fruit_copy表:
    create table fruit (name varchar,price double);
    create table fruit_copy (name varchar,price double);
  • 向fruit表中插入一行数据:
    insert into fruit values('LIchee',32);
    -- 兼容写法示例,带上table关键字
    insert into table fruit values('Cherry',88);
  • 向fruit表中插入多行数据:
    insert into fruit values('banana',10),('peach',6),('lemon',12),('apple',7);
  • 将fruit表中的数据行加载到fruit_copy表中,执行后表中有5条记录:
    insert into fruit_copy select * from fruit;
  • 先清空fruit_copy表,再将fruit中的数据加载到表中,执行之后表中有2条记录:
    insert overwrite fruit_copy select *  from fruit limit 2;
  • 对于varchar类型,仅当目标表定义的列字段长度大于源表的实际字段长度时,才可以使用INSERT... SELECT...的形式从源表中查数据并且插入到目标表:
    create table varchar50(c1 varchar(50));
    insert into varchar50 values('hetuEngine');
    create table varchar100(c1 varchar(100));
    insert into varchar100 select * from varchar50;
  • 分区表使用insert overwrite语句时,只会清理插入值所在分区的数据,而不是整个表:
    --创建表
    create table test_part (id int, alias varchar) partitioned by (dept_id int, status varchar);
    
    insert into test_part  partition(dept_id=10, status='good') values (1, 'xyz'), (2, 'abc');
    
    select * from test_part order by id;
     id | alias | dept_id | status 
    ----|-------|---------|--------
      1 | xyz   |      10 | good   
      2 | abc   |      10 | good   
    (2 rows)
    
    --清理分区partition(dept_id=25, status='overwrite'),并插入一条数据
    insert overwrite test_part (id, alias, dept_id, status) values (3, 'uvw', 25, 'overwrite');
     select * from test_part ;
     id | alias | dept_id |  status   
    ----|-------|---------|-----------
      1 | xyz   |      10 | good      
      2 | abc   |      10 | good      
      3 | uvw   |      25 | overwrite
    
    --清理分区partition(dept_id=10, status='good'),并插入一条数据
    insert overwrite test_part (id, alias, dept_id, status) values (4, 'new', 10, 'good');
    select * from test_part ordr;
     id | alias | dept_id |  status   
    ----|-------|---------|-----------
      3 | uvw   |      25 | overwrite 
      4 | new   |      10 | good      
    (2 rows)
    
    --分区表插入数据
    create table test_p_1(name string, age int) partitioned by (provice string, city string);
    
     create table test_p_2(name string, age int) partitioned by (provice string, city string);
     
    -- 填充数据到test_p_1
     insert into test_p_1 partition (provice = 'hebei', city= 'baoding') values ('xiaobei',15),( 'xiaoming',22);
    -- 根据test_p_1 插入数据到test_p_2
    
    -- 方式一
    from test_p_1 insert into table test_p_2 partition (provice = 'hebei', city= 'baoding') select name,age;
     
    -- 方式二
    insert into test_p_2 partition(provice = 'hebei', city= 'baoding') select name,age from test_p_1;

注意事项

默认无法对外部表(external)插入数据的,如需使用该功能,可以给数据源添加配置。

  • 共部署情况

    登录FusionInsight Manager,选择“集群 > 服务 > HetuEngine > 概览”,单击“HSConsole WebUI”的HSConsole链接进入计算实例界面。

    然后选择“数据源 > hive > 编辑 > 自定义配置 > 增加”来新增一条用户自定义配置项,名称为“hive.non-managed-table-writes-enabled”,值为“true”。

  • 独立部署Hive情况

    登录FusionInsight Manager,选择“集群 > 服务 > HetuEngine > 概览”,单击“HSConsole WebUI”的HSConsole链接进入计算实例界面。

    然后选择“数据源 > {hive数据源名称} > 编辑 > 自定义配置 > 增加”来新增一条用户自定义配置项,名称为“hive.non-managed-table-writes-enabled”,值为“true”。