Sqoop Merge - 使用增量导入更新记录

时间:2017-01-25 17:36:35

标签: merge sqoop

我正在尝试理解sqoop中的Merge选项,但无法理解相同的内容。我对merge选项的基本了解是它可以根据id键更新记录。

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

之后使用incremental-append选项提取记录。两个记录都被提取出来。

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

输出上述脚本

[cloudera@quickstart 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
[cloudera@quickstart sqoop_scripts]$ hadoop fs -cat /user/cloudera/kbk/sqoop1/part-m-00000
1,abc,2016-01-01
2,def,2016-01-02
[cloudera@quickstart 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 |
+------+--------+------------+

在此之后,使用以下脚本使用incremental-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

在target-dir的上述脚本中,如果我使用与前一个脚本相同的位置,脚本会抛出一个错误,告知该位置存在,然后重新运行并生成part-r-00000文件所有记录。因此将位置更改为新路径并执行相同的操作。

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

输出上述脚本

[cloudera@quickstart 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
[cloudera@quickstart sqoop_scripts]$ hadoop fs -cat /user/cloudera/kbk/sqoop2/part-m-00000
1,abcxyz,2016-01-04

我能够理解增量选项,但无法清楚地了解此合并的工作原理。我显然缺少一些东西来完全理解这一点。我理解合并的工作原理是什么(记录更新为id为1的记录)。哪里会更新?或者是否有任何其他特定步骤在记录级别进行更新(现在我们在两个不同的目录中有两个相同ID 1的记录)。是否有可能发生更新,我们只剩下一条记录(更新的记录)。

1 个答案:

答案 0 :(得分:0)

自己弄清楚答案。

我们可以使用sqoop merge选项来执行相同的操作。使用导入数据时生成的.java类,可以使用类和jar来执行合并活动。