Sqoopインクリメンタルデータのインポート
17271 ワード
sqoopを使用してインクリメンタルデータをインポートする.
コアパラメータ
--check-column
増分インポート時に増分データとしてインポートされるかどうかを確認するカラムを指定します.リレーショナル・ライン・データベースの自己増分フィールドやタイムスタンプのような指定されたカラムのタイプでは、char、varcharなどの任意の文字タイプは使用できません.また、check-columnは複数のカラムを指定できます.
--incremental
インクリメンタルインポートのモードを指定します.appendとlastmodifiedの2つのモードです.
--last-value
前回インポートでチェックした列指定フィールドの最大値を指定します.
appendモード
mysqlテーブルの作成
hiveテーブルの作成(mysqlと一致するテーブル構造)
まずmysqlの元のデータをインポートします.
インポートに成功し、hiveテーブルのデータを表示
mysqlに増分データをいくつか追加
増分データのインポートを開始し、増分データが追加される前の最大id値は3 である.
こう書いてみよう
ただしappendモードではhiveテーブルへの書き込みはサポートされていません
Append mode for hive imports is not yet supported. Please remove the parameter --append-mode
正しい書き方でhdfsに直接書き込む
job完了、hiveでテーブルデータを表示
成功しました.
Lastmodifiedモード
Mysql新しいテーブルcustomertest
データの挿入
hiveで新しいテーブルcustomertestを作成します.テーブル構造はに似ています.
mysqlテーブルのデータをインポートする
mysqlにデータが挿入されます.
挿入後のテーブルのデータ
またlast_によるとmodはインクリメンタルデータをインポートする.
インポート成功
hiveのデータを表示すると、lastmodifiedを使用すると–last-value以上の値がインポートされるため、データが重複します.
コアパラメータ
--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以上の値がインポートされるため、データが重複します.