我试图理解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条答案
按热度按时间1dkrff031#
我自己找到了答案。
我们可以使用sqoop合并选项来执行相同的操作。使用导入数据时生成的.java类,可以使用该类和jar执行合并活动。