Hive-insert into table 与 insert overwrite table 区别
区分insert into 和 insert overowrite:
0、
命令格式
INSERT OVERWRITE|INTO TABLE tablename [PARTITION (partcol1=val1, partcol2=val2 ...)] [(col1,col2 ...)]
select_statement
FROM from_statement;
参数说明
- tablename:需要插入数据的目标表名称。
- PARTITION (partcol1=val1, partcol2=val2 ...):需要插入数据的分区名称,此参数不允许使用函数等表达式,只能是常量。
- select_statement:SELECT子句,从源表中查询需要插入的数据。
- from_statement:FROM子句,代表数据来源。例如,源表名称。
功能说明
INSERT OVERWRITE/INTO
用于将计算的结果保存目标表中。
- insert into:直接向表或表的分区中追加数据。
- insert overwrite:先清空表中的原有数据,再向表或分区中插入数据。
示例
- 计算
sale_detail
表中不同地区的销售额存入表sale_detail_insert
中。--创建目标表sale_detail_insert。 create table sale_detail_insert like sale_detail; --给目标表增加分区。 alter table sale_detail_insert add partition(sale_date='2013', region='china'); --从源表sale_detail中取出数据插入目标表sale_detail_insert。 insert overwrite table sale_detail_insert partition (sale_date='2013', region='china') select shop_name, customer_id,total_price from sale_detail;
- 源表与目标表的对应关系依赖于在
select
子句中列的顺序,而不是表与表之间列名的对应关系。例如如下语句。insert overwrite table sale_detail_insert partition (sale_date='2013', region='china') select customer_id, shop_name, total_price from sale_detail;
在创建
sale_detail_insert
表时,列的顺序为shop_name string、customer_id string、total_price bigint
,而从sale_detail
向sale_detail_insert
插入数据的顺序为customer_id、shop_name、total_price
。此时,会将sale_detail.customer_id
的数据插入sale_detail_insert.shop_name
,将sale_detail.shop_name
的数据插入sale_detail_insert.customer_id
。 - 向某个分区插入数据时,分区列不允许出现在
select
列表中。下面语句报错返回,sale_date,region
为分区列,不允许出现在静态分区的insert语句中。insert overwrite table sale_detail_insert partition (sale_date='2013', region='china') select shop_name, customer_id, total_price, sale_date, region from sale_detail;
partition
的值只能是常量,不可以出现表达式。以下为错误用法。insert overwrite table sale_detail_insert partition (sale_date=datepart('2016-09-18 01:10:00', 'yyyy') , region='china') select shop_name, customer_id, total_price from sale_detail;
使用动态分区注意事项
如果您需要更新表数据到动态分区,请注意以下事项:
insert into partition
时,如果分区不存在,会自动创建分区。- 多个
insert into partition
作业并发时,如果分区不存在,会自动创建分区,但只会成功创建一个分区。 - 如果不能控制
insert into partition
作业并发,则只能通过预创建分区避免问题。
1、insert into 语句
Hive> insert into table account select id,age,name from account_tmp;
2、insert overwrite语句
hive> insert overwrite table account2 select id,age,name from account_tmp;
--------------------
overwrite本质是覆盖现有数据!!!!(清空原有数据,新增查询数据),而into是直接将数据写入库。
参考:
https://blog.csdn.net/paopaopotter/java/article/details/83616295
https://blog.csdn.net/qq_41582642/article/details/82897424
生活其实也很简单,喜欢的就去争取、得到的就珍惜、失去的就忘记。