0
我想了解sqoop中的合并选项,但无法理解相同。我对合并选项的基本理解是,它可以基于id密钥更新记录。Sqoop合并 - 使用增量导入更新记录
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');
之后提取使用增量附加选项的记录。这两个记录都被提取。
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
上述脚本
[[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/sqoop2' \
--incremental lastmodified \
--check-column recorddt \
--last-value '2016-01-03' \
--merge-key id \
--m 1
在用于目标-DIR上述脚本,如果使用相同的位置与先前的脚本,该脚本将引发错误告知的位置存在,然后重新运行并产生一个非全包含所有记录的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')
上面的脚本
[[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
的输出,我能够理解增量选项,但不能够清楚地抓住这个合并是如何工作的。我显然错过了一些东西来完全理解这一点。我错过了解合并的工作原理(记录更新为id为1的记录)。哪里会更新?或者是否有任何其他具体步骤在记录级别执行更新(现在,我们在两个不同的目录中有相同ID 1的两个记录)。有更新发生的可能性,我们只留下一个记录(更新的记录)。