之前写过一个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==$(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}
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