gpt4 book ai didi

mysql - Sqoop 增量加载 lastmodified 不适用于更新的记录

转载 作者:可可西里 更新时间:2023-11-01 08:39:09 25 4
gpt4 key购买 nike

我正在做一个 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 job后在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。任何人都可以帮助我解决这个问题。

最佳答案

您正在使用 --merge-key --appendlastmodified 一起使用。这也不正确。

  • --incremental append 模式将数据附加到 HDFS 中的现有数据集。在导入不断添加新行并增加行 ID 值的表时,您应该指定追加模式

  • --incremental lastmodified 模式 - 当源表的行可能被更新时,你应该使用它,并且每次这样的更新都会将最后修改的列的值设置为当前时间戳。

  • --merge-key - 合并工具运行一个 MapReduce 作业,该作业将两个目录作为输入:一个较新的数据集和一个较旧的数据集。这些分别用 --new-data 和 --onto 指定。 MapReduce 作业的输出将放置在 --target-dir 指定的 HDFS 目录中。

  • --last-value (value) 指定上一次导入的检查列的最大值。如果你从命令行运行 sqoop,没有 Sqoop 作业,那么你必须添加 --last-value 参数

在您的情况下,有一些新记录并且一些记录也已更新,因此您需要使用 lastmodified 模式。

您的 Sqoop 命令将是:

sqoop 作业 --create incjob -- import --connect jdbc:mysql://localhost/retail_db --username root -P --table sample --merge-key id --target-dir/user/cloudera --incremental lastmodified --check-column updated_time -m 1

因为您只指定了一个映射器,所以不需要 --split-by

关于mysql - Sqoop 增量加载 lastmodified 不适用于更新的记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45457423/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com