如何在旧版本的hive中实现更新

时间:2017-03-11 09:14:29

标签: hive hiveql

假设我有一张包含以下数据的表格:

Col1 Col2 Col3
Dipak More 123
Sachin Patil 123
Pradip More 999

我想在Dipak中使用222值更新Col3 因此,hive不允许您更新文件。所以我们如何在hive中实现

4 个答案:

答案 0 :(得分:0)

如果您使用旧版本的配置单元,则只能使用insert overwrite table语句重新加载数据。

如果要使用更新或删除语句,可以使用hive 0.14或更高版本。

答案 1 :(得分:0)

在任何情况下,您都必须重建整个数据集。

我建议使用CTAS(Create Table As Select)创建一个包含所请求数据的表,然后重命名表。
通过这种方式,如果出现问题,您将能够回滚。

create table mytable_tmp
as
select  Col1
       ,Col2
       ,case when Col1 = 'Dipak' then 222 else Col3 end

from    mytable
;

alter table mytable rename to mytable_bck_20170311
;

alter table mytable_tmp rename to mytable
;

你可以一举做到,但请记住,如果出现问题,例如查询中的拼写错误 - 您的数据已消失。

insert overwrite table mytable

select  Col1
       ,Col2
       ,case when Col1 = 'Dipak' then 222 else Col3 end

from    mytable

答案 2 :(得分:0)

这里的表t2是更新的表,其中记录得到更新,表t1保存历史记录。

下面的配置单元查询将只插入更新的记录,而不是已经存在的记录

记录详细信息:-

hive> select * from t1;

OK

10  aaa ny

20  bbb ny

Time taken: 0.02 seconds, Fetched: 2 row(s)

hive> select * from t2;

OK

20  bbb ny

10  aaa SFO .   -- updated record

Time taken: 0.023 seconds, Fetched: 2 row(s)

查询:-

insert into table t1 select c.eid as eid,c.ename as ename,c.loc as loc from t2 c where c.eid in (select a.eid from t1 a left outer join t2 b on a.eid=b.eid and a.loc= b.loc where b.loc is null);

输出:-

hive> select * from t1;

OK

10  aaa ny

20  bbb ny

10  aaa SFO -- updated in t1 table

Time taken: 0.015 seconds, Fetched: 3 row(s)

hive> 

答案 3 :(得分:0)

如果您使用的是旧的配置单元版本,这是我的解决方案/解决方法。如果目标表中有大数据,而我们又不能每次都删除并重新创建完整数据,那么这样做会更好。

再创建一个表,例如delete_keys表。这将保存主表中所有已删除的键及其代理键。

在将增量数据加载到主表时,请对主表进行左连接。对于所有匹配的记录,理想情况下,我们应该更新主表。但是,相反,我们从主表中获取所有匹配记录的键(以及代理键),并将其插入到delete_keys表中。现在,我们可以将所有增量记录插入到主表中,而不管它们是要更新还是插入。

使用delete-keys表在主表上创建视图,以便不获取与delete-keys表匹配的键。因此,此视图将成为最终目标表。此视图将不会显示来自主表的记录,这些记录已更新为最新记录。