私は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つのレコード(更新されたレコード)のみが残っている可能性はありますか?