Hive update实现方案V1.0

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Hive update实现方案

1.问题

由于hive数仓的特性,不容许数据进行修改,造成hive中的数据更新活着删除很困难的问题,自hive 0.11版本之后,hive也尝试在测试环境允许进行update和delte操作,但这些操作还不成熟,不敢在生产环境放心使用,其中也有一样不足。所以就需要找一种可靠的方案实现hive的数据更新或者删除。

2.方案

2.1.创建数据表

创建两张数据结构一模一样的hive数据表TEST、TEST_TEMP,其中TEST表的存储格式为“ORCFILE”(性能高),TEST_TEMP 表的存储格式为“TEXTFILE”(方便数据加载)。

ID NAME AGE

主键姓名年龄

create table TEST_TEMP (

id string,

name string,

age string

) comment '临时表'

partitioned by (y string,m string,d string)

row format delimited fields terminated by',' stored as textfile

create table TEST (

id string,

name string,

age string

) comment '最终表'

row format delimited fields terminated by','

stored as orcfile

2.2.初始化

1.通过hive数据load的方式先把数据加载到TEST_TEMP表中

(此处也可以通过sqoop进行数据抽取,不再详述)。

load data local inpath '/home/hadoop/a.txt'

overwrite intotable TEST_TEMP

2.通过hive insert overwrite的方式把临时表的数据加载到最终

表TEST中。

insertintotable TEST

select id,name,age from TEST_TEMP

2.3.日常

1.通过hive数据load的方式先把数据加载到TEST_TEM表中

(此处也可以通过sqoop进行数据抽取,不再详述)。

load data local inpath '/home/hadoop/b.txt'

overwrite intotable TEST_TEMP

2.通过数据比对方式,找出非更新和非增量的数据,人后把这

部分数据覆盖到TEST表中,即保证TEST中的数据和

TEST_TEMP中的没有重复(前提是表中必须有主键)。

INSERT OVERWRITE TABLE TEST

SELECT id,name,age FROM TEST a LEFT JOIN

TEST_TEMP b on a.id=b.id WHERE b.id is null;

注:上述语句其实就是not in的逻辑,如果日常数据上包含增、

删、改标识,则只需在关联时在TEST_TEMP表上加条件判

断即可。

3.经过第二步的数据比对重复处理之后,则可以直接把

TEST_TEMP中的数据追加(append)到TEST表。

insertintotable TEST

select id,name,age from TEST_TEMP;

****************增、改实现****************

注:实现比对出增、改标识

SELECT

a.id,

,

a.age,

CASEWHEN b.id ISnullTHEN'新增'ELSE'更新'END

FROM

TEST_TEMP a

LEFTJOIN TEST b on

a.id =

b.id;

数据插入

insertintotable TEST

SELECT

a.id,

,

a.age,

CASEWHEN b.id ISnullTHEN'新增'ELSE'更新'END

FROM

TEST_TEMP a

LEFTJOIN TEST b on

a.id =

b.id;

3.总结

上述的方案在逻辑上虽然解决了hive的更新操作,但只是抛砖引玉,在实际的环境可能还要进行一些表分区等优化措施。针对方案的第二点,实际也可能存在安全问题,如果这一步未执行成功那怎么回退?是在做overwrite之前做备份还是copy一份新的数据join,需要结合实际项目情况进行决策。

相关文档
最新文档