云服务器内容精选

  • 示例 创建文件“f1.txt”,填入3行数字,并通过HDFS上传到“/opt/load_test/”目录下。 --读取f1.txt的数据填充表f1 CREATE TABLE tb_load_f1(id int) with (format='TEXTFILE'); LOAD DATA INPATH '/opt/load_test/f1.txt' into table tb_load_f1; select * from tb_load_f1; id ---- 1 2 3 (3 rows) --读取/opt/load_test/目录下的文件,填充表f2 CREATE TABLE tb_load_f2(id int) with (format='TEXTFILE'); LOAD DATA INPATH '/opt/load_test/' into table tb_load_f2; select * from tb_load_f2; id ---- 1 2 3 (3 rows) --读取f3.txt文件内容填充表f3(多字段,数据分割符为'-'),并通过HDFS上传到/opt/load_test/ 目录下,f3.txt文件内容如下: 1-n1 2-n2 -- 创建目标表tb_load_f3 CREATE TABLE tb_load_f3(id int,name varchar) with(format='TEXTFILE',textfile_field_separator='-'); Load data inpath '/opt/load_test/f3.txt' into table tb_load_f3; Select * from tb_load_f3; id | name ----|------ 1 | n1 2 | n2 (2 rows)
  • 描述 向表中插入新的数据行。 如果指定了列名列表,那么这些列名列表必须与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;
  • 语法 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'));
  • 示例 非事务表场景: 清空表数据 --创建表并插入数据 create table tb_del as select * from (values(1,'suse'),(2,'centos'),(3,'euler')) as t (id,os); select * from tb_del; id | os ----|-------- 1 | suse 2 | centos 3 | euler (3 rows) --不支持通过where子句删除单条数据 delete from tb_del where id =1; Query 20201116_081955_00027_iyct5@default@HetuEngine failed: This connector only supports delete where one or more partitions are deleted entirely for Non-Transactional tables --清空表数据 delete from tb_del; select * from tb_del; id | os ----|---- (0 rows) 删除分区表hive.web.page_views中partition(date='2020-07-17', country='US')的分区: delete from hive.web.page_views where ds=date '2020-07-17' and country='US'; 事务表场景:删除指定记录 --创建事务表 create table tb_trans(a int,b string) with (transactional=true); CREATE TABLE --插入数据 insert into tb_trans values(1,'a'),(2,'b'),(3,'c'); INSERT: 3 rows --删除数据 delete from tb_trans where a=1; DELETE: 1 row
  • 示例 -- 创建事务表 create table upd_tb(col1 int,col2 string) with (format='orc',transactional=true); --插入数据 insert into upd_tb values (3,'A'),(4,'B'); --修改col1 = 4的数据 update upd_tb set col1=5 where col1=4; --查询表,col1=4的记录已被修改 select * from upd_tb; -- col1 | col2 ------|------ 5 | B 3 | A