Hive 是建立在 Hadoop 上的数据仓库基础构架。它提供了一系列的工具,可以用来进行数据提取转化加载(ETL),这是一种可以存储、查询和分析存储在 Hadoop 中的大规模数据的机制。由于 Hive 是针对数据仓库应用设计的,而数据仓库的内容是读多写少的。因此,Hive 中不支持对数据的改写和添加,所有的数据都是在加载的时候中确定好的。而数据库中的数据通常是需要经常进行修改的,因此可以使用 INSERT INTO ... VALUES 添加数据,使用 UPDATE ... SET 修改数据。但是随着云计算和hadoop的发展越来越多的传统系统需要云化,这其中必然涉及到数据的增删改查,如何根据hive的特点实现相应的功能是不能回避的,以下就是本人在hive改造oracle存储过程中的解决办法。
Update语法:
INSERT OVERWRITE TABLE tablename1 [PARTITION (partcol1=val1)]
Select [column]...,[update data]... FROM from_statement
INSERT OVERWRITE TABLE tablename1 [PARTITION (partcol1=val2)]
Select [column]... FROM [tablename1 left outer join (select [column] ... From from_statement) ON equality_expression ( AND equality_expression )* where [right table column is NULL] [WHERE where_condition]]
INSERT OVERWRITE TABLE tablename2 [PARTITION (partcol1=val)]
Select * from tablename1 where partition_name=’va1’ or partition_name=val2;
eg:A表数据如下id(String) name(String)
----------------------------
1 aaa
2 bbb
3 ccc
-----------------------------
要求更新2 bbb为2 ddd
hive脚本如下(TMP_A为分区表):
insert overwrite table TMP_A partition (p='one') select id,"ddd" from A where id = 2;
insert overwrite table TMP_A partition (p='two') select a.id,a.name from A a left outer join (select id from TMP_A where name='one') b on (a.id=b.id) where b.id is NULL:
insert overwrite table A select * from TMP_A where p='one' or p='two';
Delete语法:
INSERT OVERWRITE TABLE tablename1 [PARTITION (partcol1=val1, partcol2=val2 ...)] select_statement1 FROM from_statement
[WHERE where_condition]
[join table]
eg:A表数据如下
id(String) name(String)
----------------------------
1 aaa
2 bbb
3 ccc
-----------------------------
要求删除2 bbb
hive脚本如下:
insert overwrite table A select id,name from A where id !=2;
ADD语法
通过分区增加。
如果目标表不是分区表则需要借助中间表,将目标表中的数据放入中间表的一个分区,然后将要增加的数据放入中间表的另一个分区,然后:insert overwrite table 目标表select中间表的两个分区的数据。
如果目标表有分区则直接将要增加的数据放入目标表的一个分区。
如果要增加的数据来自hive表则用insert overwrite .... select ...语句将数据放入目标表分区
如果要增加的数据来自文件则用load data.... tablename partition...