sqoop增量導入

核心參數

  • –check-column 
    用來指定一些列,這些列在增量導入時用來檢查這些數據是否做爲增量數據進行導入,和關係型數據庫中的自增字段及時間戳相似. 
    注意:這些被指定的列的類型不能使任意字符類型,如char、varchar等類型都是不能夠的,同時–check-column能夠去指定多個列
  • –incremental 
    用來指定增量導入的模式,兩種模式分別爲Append和Lastmodified
  • –last-value 
    指定上一次導入中檢查列指定字段最大值

Append模式實戰增量導入

執行如下指令先將咱們以前的數據導入mysql

sqoop import \
--connect jdbc:mysql://master:3306/test \
--username hive \
--password 123456 \
--table customer \
-m 1

使用hdfs dfs -cat查看生成的數據文件,發現數據已經導入.而後咱們在mysql的customer中插入2條數據sql

insert into customer values(6,'james');
insert into customer values(7,'luna');

執行以下的指令,實現增量的導入數據庫

sqoop import \
--connect jdbc:mysql://master:3306/test \
--username hive \ 
--password 123456 \
--table customer \
--check-column id \
--incremental append \
--last-value 5

在數據庫的表字段中經常會設置一個自增的字段來做爲數據表的主鍵,咱們這裏以id字段來做爲判斷數據行是否爲增量數據的依據.last-value設置上次導入的id的最大值,所以sqoop就只會將id值在5~7之間的數據進行導入,實現了增量的導入 
注意:若是不指定last-value值,將會將表的全部數據進行導入,便發生了數據的冗餘app

Lastmodified導入實戰

首先咱們要建立一個customer表,指定一個時間戳字段oop

create table customertest(id int,name varchar(20),last_mod timestamp DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP);

咱們再次插入以下記錄:spa

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');

此處的時間戳設置爲在數據的產生和更新時都會發生改變. 
咱們此時執行sqoop指令將數據導入hdfs,code

sqoop import \
--connect jdbc:mysql://master:3306/test \
--username hive \
--password 123456 \
--table customertest 
-m 1

咱們再次插入一條數據進入customertest表圖片

insert into customertest(id,name) values(6,'james')

咱們使用incremental的方式進行增量的導入rem

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

此處已經會導入咱們最後插入的一條記錄,可是咱們卻發現此處插入了2條數據,這是爲何呢? 
這是由於採用lastmodified模式去處理增量時,會將大於等於last-value值的數據當作增量插入. 
注意: 
使用lastmodified模式進行增量處理要指定增量數據是以append模式(附加)仍是merge-key(合併)模式添加 
這裏寫圖片描述
咱們演示使用merge-by的模式進行增量更新,咱們去update id爲1的name字段table

update customertest set name = 'Neil' where id = 1;

更新以後,這條數據的時間戳會更新爲咱們更新數據時的系統時間,咱們執行以下指令,把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

因爲merge-key這種模式是進行了一次完整的maoreduce操做,所以最終咱們在customertest文件夾下能夠看到生成的爲part-r-00000這樣的文件,會發現id=1的name已經獲得修改,同時新增了id=6的數據

相關文章
相關標籤/搜索