使用增量导入更新记录

hiz5n14c  于 2021-06-03  发布在  Sqoop
关注(0)|答案(1)|浏览(430)

我试图理解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的记录)。有没有可能发生更新,我们只剩下一个记录(更新的记录)。

1dkrff03

1dkrff031#

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

相关问题