Sqoopインクリメンタルデータのインポート


sqoopを使用してインクリメンタルデータをインポートする.
コアパラメータ
--check-column
増分インポート時に増分データとしてインポートされるかどうかを確認するカラムを指定します.リレーショナル・ライン・データベースの自己増分フィールドやタイムスタンプのような指定されたカラムのタイプでは、char、varcharなどの任意の文字タイプは使用できません.また、check-columnは複数のカラムを指定できます.
--incremental
インクリメンタルインポートのモードを指定します.appendとlastmodifiedの2つのモードです.
--last-value
前回インポートでチェックした列指定フィールドの最大値を指定します.
appendモード
mysqlテーブルの作成
CREATE TABLE `sqoop_test` (
`id` int(11) DEFAULT NULL,
`name` varchar(255) DEFAULT NULL,
`age` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1

hiveテーブルの作成(mysqlと一致するテーブル構造)
hive> create external table sqoop_test(id int,name string,age int)
> ROW FORMAT DELIMITED
> FIELDS TERMINATED BY ,
> STORED AS TEXTFILE
> location /user/hive/external/sqoop_test;
OK
Time taken: 0.126 seconds

まずmysqlの元のデータをインポートします.
sqoop import --connect jdbc:mysql://localhost:3306/sqooptest --username root --password 123qwe --table sqoop_test
--hive-import --hive-overwrite --hive-table sqoop_test --fields-terminated-by ‘,‘ -m 1

インポートに成功し、hiveテーブルのデータを表示
hive> select * from sqoop_test;
OK
1    fz    13
3    dx    18
2    test    13
Time taken: 0.074 seconds, Fetched: 3 row(s)

mysqlに増分データをいくつか追加
1    fz    13
3    dx    18
2    test    13
4    test_add_1    14
5    test_add_2    19
6    test-add-3    35
7    test-7    7
8    test-8    8

増分データのインポートを開始し、増分データが追加される前の最大id値は3 である.
こう書いてみよう
sqoop import --connect jdbc:mysql://localhost:3306/sqooptest --username root --password 123qwe --table sqoop_test
--hive-import --hive-table sqoop_test --check-column id --incremental append --last-value 3 -m 1

ただしappendモードではhiveテーブルへの書き込みはサポートされていません
Append mode for hive imports is not yet supported. Please remove the parameter --append-mode
 
正しい書き方でhdfsに直接書き込む
sqoop import --connect jdbc:mysql://localhost:3306/sqooptest --username root --password 123qwe --table sqoop_test
--target-dir ‘/user/hive/external/sqoop_test‘ --incremental append --check-column id --last-value 3 -m 1

job完了、hiveでテーブルデータを表示
hive> select * from sqoop_test;
OK
1    fz    13
3    dx    18
2    test    13
4    test_add_1    14
5    test_add_2    19
6    test-add-3    35
7    test-7    7
8    test-8    8
Time taken: 0.075 seconds, Fetched: 8 row(s)

成功しました.
Lastmodifiedモード
Mysql新しいテーブルcustomertest
CREATE TABLE customertest (
id INT,
name VARCHAR (20),
last_mod TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);

データの挿入
insert into customertest(id,name) values(1,enzo);
insert into customertest(id,name) values(2,din);
insert into customertest(id,name) values(3,fz);
insert into customertest(id,name) values(4,dx);
insert into customertest(id,name) values(5,ef);
1    enzo    2017-09-20 16:12:54
2    din    2017-09-20 16:12:58
3    fz    2017-09-20 16:13:01
4    dx    2017-09-20 16:13:05
5    ef    2017-09-20 16:13:09

hiveで新しいテーブルcustomertestを作成します.テーブル構造はに似ています.
hive> create table customertest(id int,name string,last_mod string)
> ROW FORMAT DELIMITED
> FIELDS TERMINATED BY ,
> STORED AS TEXTFILE;
OK
Time taken: 0.189 seconds

mysqlテーブルのデータをインポートする
sqoop import --connect jdbc:mysql://localhost:3306/sqooptest --username root --password 123qwe --table customertest
--hive-import --hive-table customertest --fields-terminated-by ‘,‘ -m 1

 
hive> select * from customertest;
OK
1    enzo    2017-09-20 16:12:54.0
2    din    2017-09-20 16:12:58.0
3    fz    2017-09-20 16:13:01.0
4    dx    2017-09-20 16:13:05.0
5    ef    2017-09-20 16:13:09.0
Time taken: 0.064 seconds, Fetched: 5 row(s)

mysqlにデータが挿入されます.
insert into customertest(id,name) values(6,enzoDin)

挿入後のテーブルのデータ
1    enzo    2017-09-20 16:12:54
2    din    2017-09-20 16:12:58
3    fz    2017-09-20 16:13:01
4    dx    2017-09-20 16:13:05
5    ef    2017-09-20 16:13:09
6    enzoDin    2017-09-20 16:17:53

 
またlast_によるとmodはインクリメンタルデータをインポートする.
sqoop import --connect jdbc:mysql://localhost:3306/sqooptest --username root --password 123qwe --table customertest
--hive-import --hive-table customertest --check-column last_mod --incremental lastmodified --last-value "2017-09-20 16:13:09" --fields-terminated-by ‘,‘ -m 1

インポート成功
hive> select * from customertest;
OK
1    enzo    2017-09-20 16:12:54.0
2    din    2017-09-20 16:12:58.0
3    fz    2017-09-20 16:13:01.0
4    dx    2017-09-20 16:13:05.0
5    ef    2017-09-20 16:13:09.0
5    ef    2017-09-20 16:13:09.0
6    enzoDin    2017-09-20 16:17:53.0
Time taken: 0.064 seconds, Fetched: 7 row(s)

hiveのデータを表示すると、lastmodifiedを使用すると–last-value以上の値がインポートされるため、データが重複します.