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

Hive 如何在旧版本的配置单元中实现更新,hive,hiveql,Hive,Hiveql,假设我有一个包含以下数据的表: Col1 Col2 Col3 Dipak More 123 Sachin Patil 123 Pradip More 999 我想用Col3中的222值更新Dipak 因此,由于配置单元不允许您更新文件。因此,我们如何在配置单元中实现这一点?如果您使用的是旧版本的配置单元,则只能使用insert OVERRIDE table语句重新加载数据 如果要使用update或delete语句,可以使用hive 0.14或更高版本。在任何情况下,都必须重新生成整个数据集 我

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

Col1 Col2 Col3
Dipak More 123
Sachin Patil 123
Pradip More 999
我想用
Col3
中的
222
值更新
Dipak

因此,由于配置单元不允许您更新文件。因此,我们如何在配置单元中实现这一点?如果您使用的是旧版本的配置单元,则只能使用insert OVERRIDE table语句重新加载数据


如果要使用update或delete语句,可以使用hive 0.14或更高版本。

在任何情况下,都必须重新生成整个数据集

我建议使用CTA(创建表作为选择)创建一个包含请求数据的表,然后重命名这些表。
这样,如果出现问题,您将能够回滚

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

表t2是一个更新的表,其中记录得到更新,表t1保存历史记录

下面的配置单元查询将只插入更新的记录,而不是现有的记录

记录详情:- 查询:- 输出:-
如果您使用的是旧配置单元版本,以下是我的解决方案/解决方法。当您的目标表中有大量数据,而我们不能每次都用完整的数据删除和重新创建这些数据时,这种方法效果会更好

再创建一个表,比如说delete_keys表。这将保存主表中与其代理项一起删除的所有项

将增量数据加载到主表中时,与主表进行左连接。对于所有匹配的记录,我们最好更新主表。但相反,我们从主表中获取所有匹配记录的键(以及代理键),并插入该键以删除表中的键。现在,我们可以按原样将所有增量记录插入主表,而不管它们是要更新还是要插入


使用“删除键表”在主表上创建视图,以便不提取与“删除键表”匹配的键。所以,这个视图将是最终的目标表。此视图不会显示主表中使用最新记录更新的记录。

请详细说明如何在您的情况下插入覆盖工作。如果使用insert OVERVERT语句进行更新,您可以编写如下内容。插入覆盖表YourTable作为从YourTable中选择col1,col2,if(col1='Dipak',222,col3);请阅读以下内容:
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>