sqoop增量导入且表无主键

本文介绍了一种在没有主键的情况下使用Sqoop进行增量导入的方法,适用于只有增量字段且数据量大的场景。文中详细说明了如何创建临时表与最终表,并提供了一段用于增量更新的Hive SQL代码。

之前写过一个sqoop增量导入的文章http://blog.csdn.net/qq_20641565/article/details/52763663,自己控制增量导入,但是那个架构需要表有主键值,但是一般在实际中有的表却没有主键只有增量字段而且数据量特别大,这样的情况就不能使用之前那篇文章写的方式自己控制增量同步数据了,可以用如下的方法解决。

1.使用sqoop的增量导入;
这里就不介绍了,网上有很多例子。

2.根据上一篇文章的架构,根据增量字段导入

其实这种方式和直接使用sqoop自带的增量导入效果一样,但是为了规范化流程(因为都是通过公共shell脚本,从前台取参数执行),所以使用以下方式增量导入

中间表和最终表结构如下:

create table test_temp (
    name string,
    addr string,
    update_time string
) comment '临时表'
partitioned by (y string,m string,d string)
row format delimited fields terminated by ','
stored as textfile

create table test (
    name string,
    addr string,
    update_time string
) comment '最终表'
row format delimited fields terminated by ','
stored as orcfile

将之前那片文章中的 “6.合并” 步骤改为如下代码(如果是增量更新10月09的数据):

#其中
startdate="20161009"
enddate="20161010"

insert overwrite table test
select 
    a.name,a.addr,a.update_time 
from 
    test
where
    a.update_time >= ${enddate} or a.update_time < ${startdate}


--把中间表的数据 into 到test表中
insert into table test select name,addr,update_time from test_temp where y='2016' and m='10' and d='09';

但是这样有个弊端:

如果前面数据有修改,这样不能去重!和sqoop自带的同步一样,如果想修改历史数据后还能去重,就参照上一篇文章http://blog.csdn.net/qq_20641565/article/details/52763663


之后又有一个需求,需要流式导入数据,意思就是hive里面的数据只有当天前30天的增量更新(比如7月1号的时候,test表只有6月1号到6月30号的数据,到7月2号的时候,test表只有6月2号到7月1号的数据,以此内推)可以按照如下方式解决:

#先定义一个dateMonth
dateMonth==$(date -d "30 days ago" +%Y%m%d)
#这里先写死,正常流程是从控制台传入参数
startdate="20161009"
enddate="20161010"
#
insert overwrite table test
select 
    a.name,a.addr,a.update_time 
from 
    test
where
    a.update_time >= ${enddate} or a.update_time < ${startdate}
    and a.update_time >= ${dateMonth}

#把中间表的数据 into 到test表中
insert into table test select name,addr,update_time from test_temp where y='2016' and m='10' and d='09';

按照如上方式就能按照天增量导入数据,并保持数据为最新的30天的数据。

标记下:
一个表92个字段 2千万数据 大概20G
一个表26个字段 1亿条数据 大概20G;2亿4千万 大概53G

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值