2017-01-25 34 views
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的两个记录)。有更新发生的可能性,我们只留下一个记录(更新的记录)。

回答

0

自己想出了答案。

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