【发布时间】:2017-08-03 21:40:40
【问题描述】:
我正在做一个 sqoop 增量作业,将数据从 mysql 加载到 hdfs。以下是以下场景。
场景 1: 下面是在mysql的示例表中插入的记录。
select * from sample;
+-----+--------+--------+---------------------+
| id | policy | salary | updated_time |
+-----+--------+--------+---------------------+
| 100 | 1 | 4567 | 2017-08-02 01:58:28 |
| 200 | 2 | 3456 | 2017-08-02 01:58:29 |
| 300 | 3 | 2345 | 2017-08-02 01:58:29 |
+-----+--------+--------+---------------------+
下面是mysql中示例表的表结构:
create table sample (id int not null primary key, policy int, salary int, updated_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP);
我正在尝试通过创建如下所示的 sqoop 作业将其导入 hdfs
sqoop job --create incjob -- import --connect jdbc:mysql://localhost/retail_db --username root -P --table sample --merge-key id --split-by id --target-dir /user/cloudera --append --incremental lastmodified --check-column updated_time -m 1
执行sqoop作业后下面是hdfs中的输出记录。
$ hadoop fs -cat /user/cloudera/par*
100,1,4567,2017-08-02 01:58:28.0
200,2,3456,2017-08-02 01:58:29.0
300,3,2345,2017-08-02 01:58:29.0
场景 2: 在插入少量新记录并更新示例表中的现有记录之后。下面是示例表。
select * from sample;
+-----+--------+--------+---------------------+
| id | policy | salary | updated_time |
+-----+--------+--------+---------------------+
| 100 | 6 | 5638 | 2017-08-02 02:01:09 |
| 200 | 2 | 7654 | 2017-08-02 02:01:10 |
| 300 | 3 | 2345 | 2017-08-02 01:58:29 |
| 400 | 4 | 1234 | 2017-08-02 02:01:17 |
| 500 | 5 | 6543 | 2017-08-02 02:01:18 |
+-----+--------+--------+---------------------+
运行相同的sqoop作业后,下面是hdfs中的记录。
hadoop fs -cat /user/cloudera/par*
100,1,4567,2017-08-02 01:58:28.0
200,2,3456,2017-08-02 01:58:29.0
300,3,2345,2017-08-02 01:58:29.0
100,6,5638,2017-08-02 02:01:09.0
200,2,7654,2017-08-02 02:01:10.0
400,4,1234,2017-08-02 02:01:17.0
500,5,6543,2017-08-02 02:01:18.0
这里将mysql中更新的记录作为新记录插入hdfs中,而不是更新hdfs中的现有记录。我在我的 sqoop 作业 conf 中同时使用了 --merge-key 和 --append。能否帮助我解决此问题。
【问题讨论】: