Sqoop提供将新数据导入,而已经导入的数据不再执行导入操作,即增量导入操作。使用以下参数:
--check-column (col) |
指定一个“标志列”用于判断增量导入的数据范围,该列不能是字符型,最好是数字或者日期型(这个很好理解吧)。 |
--incremental (mode) |
指定增量模式,包含“追加模式” append 和“最后修改模式” lastmodified (该模式更满足常见需求)。 |
--last-value (value) |
指定“标志列”上次导入的上界。如果“标志列”是最后修改时间,则--last-value为上次执行导入脚本的时间。 |
创建增量更新job:
sqoop job --create myjob -- import --connect jdbc:Oracle:thin:@192.168.0.138:1521:orcl --username ora --password oraalk --table FBI_SQOOPTEST --hive-import --target-dir /usr/input --incremental append --check-column ID --last-value 0
执行Job:
sqoop job --exec myjob
注:数据库里有主键的表才可以读取,这个是我测试的结果
在执行job时会有数据库密码的校验:
$ sqoop job --exec myjob
Enter password:
...
sqoop-metastore命令可以检查你配置sqoop数据连接的正确性,所有要更改配置在sqoop-site.xml中:
sqoop.metastore.client.record.password
true
If true, allow saved passwords in the metastore.
当这个值为真的时候才会保存密码。
sqoop job --delete myjob
重复上述操作,执行时不用输入数据库密码校验。
hdfs dfs -cat /usr/input/*
56,hua,hanyun,男,开通,2013-12-02,0,1
58,feng,123456,男,开通,2013-11-22,0,0
59,test,123456,男,开通,2014-03-05,58,0
60,user1,123456,男,开通,2014-06-26,66,0
61,user2,123,男,开通,2013-12-13,56,0
62,user3,123456,男,开通,2013-12-14,0,0
64,kai.zhou,123456,null,null,2014-03-05,65,0
65,test1,111,男,未开通,null,0,0
66,test2,111,男,未开通,null,0,0
67,test3,113,男,未开通,null,0,0
为了测试只导入新增的数据,把hdfs上的数据都删除
hdfs dfs -rmr /usr/input/*
接下来到oracle里插入一条数据,再执行任务:
sqoop job --exec myjob
再查看只有新增的一条数据:
68,test3,113,男,未开通,null,0,0
Sqoop的“Saved Jobs”机制对于增量导入类Job,自动记录了上一次的执行内容,并自动将该时间赋值给下一次执行的--last-value参数!也就是说,我们只需要通过crontab设定定期执行该job即可,job中的--last-value将被“Saved Jobs”机制自动更新以实现真正意义的增量导入。