Hive之insert into 和insert overwrite

  1. hive通常有三种方式对包含分区字段的表进行数据插入

1)静态插入数据:要求插入数据时指定与建表时相同的分区字段,如:

insert overwrite tablename (year='2017', month='03') select a, b from tablename2;

2)动静混合分区插入:要求指定部分分区字段的值,如:

insert overwrite tablename (year='2017', month) select a, b from tablename2;

3)动态分区插入:只指定分区字段,不用指定值,如:

insert overwrite tablename (year, month) select a, b from tablename2;
  1. 插入insert into 和 insert overwrite

INSERT INTO

insert into table tablename1 select a, b, c from tablename2;

INSERT OVERWRITE

insert overwrite table tablename1 select a, b, c from tablename2;

两者的异同
insert into 与 insert overwrite 都可以向hive表中插入数据,但是insert into直接追加到表中数据的尾部,而insert overwrite会重写数据,既先进行删除,再写入。如果存在分区的情况,insert overwrite会只重写当前分区数据。

INSERT OVERWRITE TABLE employees
PARTITION (country = '中国', state = '北京')
SELECT * FROM staged_employees se
WHERE se.cnty = '中国' AND se.st = '北京';

由于使用了OVERWRITE关键字,目标表中原来相同partition中的所有数据被覆盖,如果目标表中没有partition,则整个表会被覆盖。
如果把OVERWRITE关键字删掉,或者替换成INTO,则hive会追加而不是替代原分区或原表中的数据,这个特性在Hive v0.8.0之后才支持。

INSERT OVERWRITE TABLE employees
PARTITION (country, state)
SELECT ..., se.cnty, se.st
FROM staged_employees se;

hive先获取select的最后两个位置的se.cnty和se.st参数值,然后将这两个值填写到Insert语句partition中的两个country和state变量中,即动态分区是通过位置来对应分区值的。原始表select出来的值和输出partition的值的关系仅仅是通过位置来确定的,和名字并没有关系,比如这里se.cnty和county的名称完全没有关系。

只要位置正确,你可以混用动态分区和静态分区值设定,比如下面这个例子,你可以静态指定一个country值,但是state值采用动态的方法设定:

INSERT OVERWRITE TABLE employees
PARTITION (country = 'US', state)
SELECT ..., se.cnty, se.st
FROM staged_employees se
WHERE se.cnty = 'US';

注意:静态分区值必须在动态分区值的前面!