sqoop 增量导入,不重复
在實際的生產環(huán)境下,我們常常是要繼續(xù)數據增量的導入
核心參數
–check-column
用來指定一些列,這些列在增量導入時用來檢查這些數據是否作為增量數據進行導入,和關系型數據庫中的自增字段及時間戳類似.
注意:這些被指定的列的類型不能使任意字符類型,如char、varchar等類型都是不可以的,同時–check-column可以去指定多個列
–incremental
用來指定增量導入的模式,兩種模式分別為Append和Lastmodified
–last-value
指定上一次導入中檢查列指定字段最大值
Append模式實戰(zhàn)增量導入
執(zhí)行以下指令先將我們之前的數據導入
sqoop import \
--connect jdbc:mysql://master:3306/test \
--username hive \
--password 123456 \
--table customer \
-m 1
1
2
3
4
5
6
使用hdfs dfs -cat查看生成的數據文件,發(fā)現數據已經導入.然后我們在mysql的customer中插入2條數據
insert into customer values(6,'james');
insert into customer values(7,'luna');
1
2
執(zhí)行如下的指令,實現增量的導入
sqoop import \
--connect jdbc:mysql://master:3306/test \
--username hive \?
--password 123456 \
--table customer \
--check-column id \
--incremental append \
--last-value 5
1
2
3
4
5
6
7
8
在數據庫的表字段中常常會設置一個自增的字段來作為數據表的主鍵,我們這里以id字段來作為判斷數據行是否為增量數據的依據.last-value設置上次導入的id的最大值,因此sqoop就只會將id值在5~7之間的數據進行導入,實現了增量的導入
注意:如果不指定last-value值,將會將表的所有數據進行導入,便發(fā)生了數據的冗余
Lastmodified導入實戰(zhàn)
首先我們要創(chuàng)建一個customer表,指定一個時間戳字段
create table customertest(id int,name varchar(20),last_mod timestamp DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP);
1
我們再次插入如下記錄:
insert into customertest(id,name) values(1,'neil');
insert into customertest(id,name) values(2,'jack');
insert into customertest(id,name) values(3,'martin');
insert into customertest(id,name) values(4,'tony');
insert into customertest(id,name) values(5,'eric');
1
2
3
4
5
此處的時間戳設置為在數據的產生和更新時都會發(fā)生改變.
我們此時執(zhí)行sqoop指令將數據導入hdfs,
sqoop import \
--connect jdbc:mysql://master:3306/test \
--username hive \
--password 123456 \
--table customertest?
-m 1
1
2
3
4
5
6
我們再次插入一條數據進入customertest表
insert into customertest(id,name) values(6,'james')
1
我們使用incremental的方式進行增量的導入
sqoop import \
--connect jdbc:mysql://master:3306/test \
--username hive \
--password 123456 \
--table customertest \
--check-column last_mod \
--incremental lastmodified \
--last-value "2016-12-15 15:47:29" \
-m 1 \
--append?
1
2
3
4
5
6
7
8
9
10
此處已經會導入我們最后插入的一條記錄,但是我們卻發(fā)現此處插入了2條數據,這是為什么呢?
這是因為采用lastmodified模式去處理增量時,會將大于等于last-value值的數據當做增量插入.
注意:
使用lastmodified模式進行增量處理要指定增量數據是以append模式(附加)還是merge-key(合并)模式添加
我們演示使用merge-by的模式進行增量更新,我們去update id為1的name字段
update customertest set name = 'Neil' where id = 1;
1
更新之后,這條數據的時間戳會更新為我們更新數據時的系統(tǒng)時間,我們執(zhí)行如下指令,把id字段作為merge-key
sqoop import \
--connect jdbc:mysql://master:3306/test \
--username hive \
--password 123456 \
--table customertest \
--check-column last_mod \
--incremental lastmodified \
--last-value "2016-12-15 15:47:30" \
-m 1 \
--merge-key id?
1
2
3
4
5
6
7
8
9
10
由于merge-key這種模式是進行了一次完整的maoreduce操作,因此最終我們在customertest文件夾下可以看到生成的為part-r-00000這樣的文件,會發(fā)現id=1的name已經得到修改,同時新增了id=6的數據
————————————————
版權聲明:本文為CSDN博主「過河卒子Rover」的原創(chuàng)文章,遵循CC 4.0 BY-SA版權協(xié)議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/qq_26937525/article/details/53670213
總結
以上是生活随笔為你收集整理的sqoop 增量导入,不重复的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 图片路径上传的配置问题
- 下一篇: 【功能升级】达摩盘3.0全新标签介绍前言