hive中的增删改如何实现

来源:互联网 发布:搜一次cms官网 编辑:程序博客网 时间:2024/04/29 23:01

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...


0 0