假设我有一张包含以下数据的表格:
Col1 Col2 Col3
Dipak More 123
Sachin Patil 123
Pradip More 999
我想在Dipak
中使用222
值更新Col3
因此,hive不允许您更新文件。所以我们如何在hive中实现
答案 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表匹配的键。因此,此视图将成为最终目标表。此视图将不会显示来自主表的记录,这些记录已更新为最新记录。