2017-01-25 4 views
0

私はsqoopでMergeオプションを理解しようとしていますが、同じことを理解することはできません。マージオプションについての私の基本的な理解は、IDキーに基づいてレコードを更新できるということです。Sqoop Merge - 増分インポートを使用してレコードを更新します。

create table customer (id int, name varchar(100), recorddt date); 
insert into customer values (1,'abc','2016-01-01'); 
insert into customer values (2,'def','2016-01-02'); 

この後、増分追加オプションを使用してレコードを抽出しました。両方のレコードが抽出されます。上記のスクリプト

[[email protected] sqoop_scripts]$ hadoop fs -ls /user/cloudera/kbk/sqoop1 
Found 1 items 
-rw-r--r-- 1 cloudera cloudera   34 2017-01-01 05:49 /user/cloudera/kbk/sqoop1/part-m-00000 
[[email protected] sqoop_scripts]$ hadoop fs -cat /user/cloudera/kbk/sqoop1/part-m-00000 
1,abc,2016-01-01 
2,def,2016-01-02 
[[email protected] sqoop_scripts]$ 

更新のレコードこの後

update customer set name = 'abcxyz', recorddt = '2016-01-04' where id = 1; 

mysql> select * from customer; 
+------+--------+------------+ 
| id | name | recorddt | 
+------+--------+------------+ 
| 1 | abcxyz | 2016-01-04 | 
| 2 | def | 2016-01-02 | 
+------+--------+------------+ 

sqoop import \ 
--connect jdbc:mysql://localhost/training_db \ 
--username root \ 
--password cloudera \ 
--table customer \ 
--target-dir '/user/cloudera/kbk/sqoop1' \ 
--incremental append \ 
--check-column id \ 
--last-value 0 \ 
--m 1 

出力は、以下のスクリプトを使用して増分LASTMODIFIEDオプションを使用してレコードを抽出します。ターゲットディレクトリのための上記のスクリプトにおいて

sqoop import \ 
--connect jdbc:mysql://localhost/training_db \ 
--username root \ 
--password cloudera \ 
--table customer \ 
--target-dir '/user/cloudera/kbk/sqoop2' \ 
--incremental lastmodified \ 
--check-column recorddt \ 
--last-value '2016-01-03' \ 
--merge-key id \ 
--m 1 

Iは、前のスクリプトと同じ場所を使用する場合、スクリプトは、位置が存在し、再度実行され、part-を生成することを伝えるエラーをスローすべてのレコードを含むr-00000ファイル。場所を新しいパスに変更し、同じパスを実行しました。上記のスクリプト

[[email protected] sqoop_scripts]$ hadoop fs -ls /user/cloudera/kbk/sqoop2 
Found 2 items 
-rw-r--r-- 1 cloudera cloudera   0 2017-01-01 05:54 /user/cloudera/kbk/sqoop2/_SUCCESS 
-rw-r--r-- 1 cloudera cloudera   20 2017-01-01 05:54 /user/cloudera/kbk/sqoop2/part-m-00000 
[[email protected] sqoop_scripts]$ hadoop fs -cat /user/cloudera/kbk/sqoop2/part-m-00000 
1,abcxyz,2016-01-04 

17/01/01 05:54:48 INFO mapreduce.ImportJobBase: Transferred 20 bytes in 31.8766 seconds (0.6274 bytes/sec) 
17/01/01 05:54:48 INFO mapreduce.ImportJobBase: Retrieved 1 records. 
17/01/01 05:54:48 INFO tool.ImportTool: Final destination exists, will run merge job. 
17/01/01 05:54:48 INFO tool.ImportTool: Moving data from temporary directory _sqoop/be32a583f44e47ebbde872e58513d40f_customer to final destination 

/user/cloudera/kbk/sqoop2 
17/01/01 05:54:48 INFO tool.ImportTool: Incremental import complete! To run another incremental import of all data following this import, supply the following 

arguments: 
17/01/01 05:54:48 INFO tool.ImportTool: --incremental lastmodified 
17/01/01 05:54:48 INFO tool.ImportTool: --check-column recorddt 
17/01/01 05:54:48 INFO tool.ImportTool: --last-value 2017-01-01 05:54:16.0 
17/01/01 05:54:48 INFO tool.ImportTool: (Consider saving this with 'sqoop job --create') 

出力は、私は明らかにこのマージがどのように機能するかをキャッチすることがincrementalオプションとを理解することはありませんよ。私はこれを完全に理解するための何かを明確に欠いている。マージの仕組みを理解するために何が欠けているのですか(レコードはidが1のレコードに対して更新されます)。それはどこで更新されますか?または、レコードレベルでその更新を行うための他の特定のステップがあります(ここでは、2つの異なるディレクトリに同じID 1のレコードが2つあります)。更新が行われ、1つのレコード(更新されたレコード)のみが残っている可能性はありますか?

答えて

0

自分自身で答えを見つけました。

sqoopマージオプションを使用して同じ処理を実行できます。データのインポート時に生成される.javaクラスを使用すると、クラスとjarを使用してマージ・アクティビティを実行できます。

関連する問題