Hive中实现增量更新

保险公司有一个表记录客户的信息,其中包括有客户的id,name和age(为了演示只列出这几个字段)。

创建Hive的表:

create table customer

(

id int,

age tinyint,

name string

)

partitioned by(dt string)

row format delimited

fields terminated by ‘|‘

stored as textfile;

导入初始化数据:

load data local inpath ‘/home/hadoop/hivetestdata/customer.txt‘ into table customer partition(dt = ‘201506‘);

hive> select * from customer order by id;

customer.id customer.age
customer.name customer.dt

1 25 jiangshouzhuang
201506

2 23 zhangyun
201506

3 24 yiyi
201506

4 32 mengmeng
201506

对于保险公司来说,客户每天都会发生变化,我们使用临时数据表customer_temp来记录每天客户信息,字段和属性与customer表一致,

create table customer_temp like customer;

load data local inpath ‘/home/hadoop/hivetestdata/customer_temp.txt‘ into table customer_temp partition(dt = ‘201506‘);

包含的数据示例如下所示:

hive> select * from customer_temp;

customer_temp.id customer_temp.age
customer_temp.name customer_temp.dt

1 26 jiangshouzhuang
201506

5 45 xiaosan
201506

如果需要实现客户表的增量更新,我们需要将两个表进行full outer join,将customer_temp表中发生修改的数据更新到customer表中。

hive (hive)> select * from customer_temp

> union all

> select a.* from customer a

> left outer join customer_temp b

> on a.id = b.id where b.id is null;

_u1.id _u1.age
_u1.name _u1.dt

2 23 zhangyun
201506

3 24 yiyi
201506

4 32 mengmeng
201506

1 26 jiangshouzhuang
201506

5 45 xiaosan
201506

之前看到网上有使用类似如下的方法,感觉是存在问题的:

hive> select customer.id,

coalesce(customer_temp.age,customer.age),

customer.name,

coalesce(customer_temp.dt,customer.dt)

from customer_temp

full outer join customer on customer_temp.id = customer.id;

执行后的结果为:

customer.id _c1
customer.name _c3

1 26 jiangshouzhuang
201506

2 23 zhangyun
201506

3 24 yiyi
201506

4 32 mengmeng
201506

NULL 45
NULL 201506

可以看出的确是有问题的。

如果朋友们有更好的优化方法请赐教,谢谢。

时间: 2024-10-14 06:33:52

Hive中实现增量更新的相关文章

增量队列Delta Queue(RSA7)中的增量更新区Delta Update、增量重复区Delta Repetition

声明:原创作品,转载时请注明文章来自SAP师太技术博客:www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将追究法律责任!原文链接:http://www.cnblogs.com/jiangzhengjun/p/4296586.html "增量更新Delta Update"区:存储的是至上次提取之后到时目前所有增量的数据:每次抽取之后(不管是从"增量更新Delta Update"区还是从"增量重复Delta Re

【甘道夫】Sqoop1.4.4 实现将 Oracle10g 中的增量数据导入 Hive0.13.1 ,并更新Hive中的主表

需求 将Oracle中的业务基础表增量数据导入Hive中,与当前的全量表合并为最新的全量表. ***欢迎转载,请注明来源***    http://blog.csdn.net/u010967382/article/details/38735381 设计 涉及的三张表: 全量表:保存了截止上一次同步时间的全量基础数据表 增量表:增量临时表 更新后的全量表:更新后的全量数据表 步骤: 通过Sqoop将Oracle中的表导入Hive,模拟全量表和增量表 通过Hive将"全量表+增量表"合并为

SQOOP增量抽取时,在HIVE中实现类似Oracle的merge操作

数据仓库建设中的数据抽取环节,常常需要增量抽取业务库数据.但业务库数据不是一层不变的,会根据时间发生状态变更,那么就需要同步更新变化数据到HIVE中.过去在Oracle上做数据仓库时,可以使用merge的方法合并新老数据.但hive中没有该功能,本文旨在通过sqoop抽取后,自动实现数据合并. 表设计 将抽取表分为三张, 一张_arc表,保存每日合并后的快照,根据pt字段分区 一张_inc表,用于保存当日抽取的增量数据,根据pt字段分区 一张不带后缀的表,指向最终表给后续ETL任务使用. 步骤

使用sqoop从mysql往hive中增量导数据shell脚本

一:sqoop增量导入的两种方式 Incremental import arguments: Argument Description --check-column (col) Specifies the column to be examined when determining which rows to import. (the column should not be of type CHAR/NCHAR/VARCHAR/VARNCHAR/ LONGVARCHAR/LONGNVARCHA

谈谈混合 App Web 资源的打包与增量更新

综述 移动 App 的运行环境具有带宽不稳定,流量收费,启动速度比较重要等特点,所以混合 App 如何加载 Web 资源并不是一个新问题.本文目的是总结出一种资源打包下载的思路和方案,并且提供一种打包工具.本文提到的思路只是一家之言,基本没有参考现有方案,各位方家有不同意见欢迎留言.另外本文没有涉及到 App 内部如何加载资源的问题,这部分我会专门撰写一篇文章讨论. 需求梳理 一般来说,Hybrid-app 对于 Web 资源下载有如下需求: 页面开启速度要快,所以资源的下载和使用不是在同一时间

一步一步跟我学习lucene(19)---lucene增量更新和NRT(near-real-time)Query近实时查询

这两天加班,不能兼顾博客的更新,请大家见谅. 有时候我们创建完索引之后,数据源可能有更新的内容,而我们又想像数据库那样能直接体现在查询中,这里就是我们所说的增量索引.对于这样的需求我们怎么来实现呢?lucene内部是没有提供这种增量索引的实现的: 这里我们一般可能会想到,将之前的索引全部删除,然后进行索引的重建.对于这种做法,如果数据源的条数不是特别大的情况下倒还可以,如果数据源的条数特别大的话,势必会造成查询数据耗时,同时索引的构建也是比较耗时的,几相叠加,势必可能造成查询的时候数据缺失的情况

【安卓】数据库基于脚本的"增量更新",每次更新时不需修改java代码、!

思路: 1.当然是基于SQLiteOpenHelper.onCreate(第一次安装程序时调用).onUpdate(升级程序时调用) 2.用"脚本"(脚本制作具体方法问度娘)做数据库升级,文件名标识对应版本,java中根据"上一版本.当前版本"选择执行的脚本. 升级时,修改DB_VERSION(当前版本)即可. DBManager.java: package com.example.test; import java.io.ByteArrayOutputStream

移动端缓存增量更新

移动端缓存增量更新 在app的时候, 为了用户体验, 一般都会引入缓存来加速app的运行. 而缓存这东西用的好则是倚天剑, 用的不好, 容易带进脏数据. 这里来说说移动端缓存增量更新的设计思想. 以通讯录为例子. 通讯录 场景1 : app上没有任何缓存记录. 场景2 : app上存在缓存记录, 但是有一段时间没有使用改app, 不能确保缓存为最新. 场景3:  app正在使用缓存. 在上述三个场景中, 最麻烦的就是场景2, 因为可能会出现server在app不使用的时间段对通讯录中的信息进行了

SSIS 实例 从Ftp获取多个文件并对数据库进行增量更新。

整个流程 Step 1 放置一个FTP Task 将远程文件复制到本地 建立FTP链接管理器后 Is LocalPatchVariable 设置为Ture 并创建一个变量设置本地路径 Operation 设置为 Receive files OverwriteFileAtDest 设置为True 同样的设置远程路径变量 Step 2 放置一个Foreach Loop ,循环将文件内容导入到数据库 Collection 页中Enumerator 选择Foreach File Enumerator 图