如何在旧版本的配置单元中实现更新

i7uq4tfw  于 2021-06-26  发布在  Hive
关注(0)|答案(4)|浏览(240)

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

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

我想更新 Dipak222 中的值 Col3 所以由于hive不允许您更新文件。那么我们如何在hive中实现呢

csga3l58

csga3l581#

这里,表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)

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

yyhrrdl82#

如果使用的是旧版本的配置单元,则只能使用insert overwrite table语句重新加载数据。
如果要使用update或delete语句,可以使用配置单元0.14或更高版本。

qoefvg9y

qoefvg9y3#

如果您使用的是旧的配置单元版本,下面是我的解决方案/解决方法。如果目标表中有大量数据,而我们无法每次都用完整数据删除和重新创建这些数据,则这种方法效果更好。
再创建一个表,比如delete\u keys table。这将保存主表中与其代理项一起被删除的所有项。
将增量数据加载到主表中时,请与主表进行左联接。对于所有匹配的记录,我们最好更新主表。但相反,我们从主表中获取所有匹配记录的键(以及代理键),并插入该键以删除表中的键。现在,我们可以将所有增量记录按原样插入主表,而不管它们是要更新还是插入。
使用delete keys table在主表上创建视图,以便不获取与delete keys table匹配的键。所以,这个视图将是最终的目标表。此视图不会显示用最新记录更新的主表中的记录。

ykejflvf

ykejflvf4#

无论如何,你必须重建整个数据集。
我建议使用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

相关问题