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)
query:-
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);
output:-
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>
无论如何,你必须重建整个数据集。 我建议使用cta(createtable 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
4条答案
按热度按时间csga3l581#
这里,表t2是一个更新的表,其中记录得到更新,表t1保存历史记录。
下面的配置单元查询将只插入更新的记录,而不是现有的记录
记录详细信息:-
query:-
output:-
yyhrrdl82#
如果使用的是旧版本的配置单元,则只能使用insert overwrite table语句重新加载数据。
如果要使用update或delete语句,可以使用配置单元0.14或更高版本。
qoefvg9y3#
如果您使用的是旧的配置单元版本,下面是我的解决方案/解决方法。如果目标表中有大量数据,而我们无法每次都用完整数据删除和重新创建这些数据,则这种方法效果更好。
再创建一个表,比如delete\u keys table。这将保存主表中与其代理项一起被删除的所有项。
将增量数据加载到主表中时,请与主表进行左联接。对于所有匹配的记录,我们最好更新主表。但相反,我们从主表中获取所有匹配记录的键(以及代理键),并插入该键以删除表中的键。现在,我们可以将所有增量记录按原样插入主表,而不管它们是要更新还是插入。
使用delete keys table在主表上创建视图,以便不获取与delete keys table匹配的键。所以,这个视图将是最终的目标表。此视图不会显示用最新记录更新的主表中的记录。
ykejflvf4#
无论如何,你必须重建整个数据集。
我建议使用cta(createtable as select)创建一个包含请求数据的表,然后重命名这些表。
这样,如果出现问题,您就可以回滚。
你可以一蹴而就,但要记住,如果有什么地方出错了,比如你的查询输入错误,你的数据就不见了。