Sqoop增量更新(自动更新参数)

Sqoop动态增量导入实战
本文介绍使用Sqoop进行动态增量数据导入的解决方案,通过创建并注册Sqoop作业,实现自动记录并使用上一次导入的时间戳作为增量导入的起始点,避免了手动指定--last-value参数的繁琐。

1原始导出脚本:

sqoop import --connect jdbc:mysql://dev07:3306/dianpingdb --username root --password root --table category --target-dir /user/zxh/sqoop1 --incremental lastmodified --check-column updated_at --merge-key id --last-value "2019-06-12 12:39:43" --m 1 --fields-terminated-by "\t"

1.1问题:

每次增量更新时都得动态的传入--last-value。

1.2 解决方案:

查阅运行日志发现如下说明

 

想动态保存需要注册成job(作业)。

2 Sqoop作业

2.1注册job执行脚本:

sqoop job \

--create myjob1 \

-- import \

--connect jdbc:mysql://dev07:3306/dianpingdb \

--username root \

--password root \

--table category \

--target-dir /user/zxh/sqoop1 \

--incremental lastmodified \

--check-column updated_at --merge-key id \

--last-value "2019-06-12 12:39:43" \

--m 1 \

--fields-terminated-by "\t"

2.2 验证作业

sqoop job --list 

 

2.3 执行作业

sqoop job --exec myjob1

会出现输入密码提示:

 

2.4 输入密码问题解决

在sqoop 配置文件sqoop-site.xml下增加如下配置:

<property>

    <name>sqoop.metastore.client.record.password</name>

    <value>true</value>

    <description>If true, allow saved passwords in the metastore.

    </description>

</property>

2.5 注意事项

在修改完配置文件后重新执行myjob1 还是会显示输入密码,此时需要将之前注册的job删除,在重新注册,首次执行时会根据你传入的参数进行查询,再次执行时会自动读取上次的执行时间。

 

### 三、Sqoop 实现数据的增量更新方法 Sqoop 支持多种方式实现数据的增量更新,主要通过 `--incremental` 参数控制增量导入的类型,结合 `--check-column` 和 `--last-value` 来实现数据的自动同步与更新。 #### 1. 增量导入类型 Sqoop 提供了两种主要的增量导入模式: - **append**:适用于基于自增列(如 ID)的增量导入。这种方式仅导入大于 `--last-value` 的记录。 - **lastmodified**:适用于基于时间戳字段的增量导入。这种方式导入在指定时间之后更新或插入的记录。 例如,使用 `append` 模式进行增量导入的命令如下: ```bash sqoop import \ --connect jdbc:mysql://xxx:3306/xxx \ --username root \ --password root \ --table category \ --target-dir /user/survey/sqoop1 \ --incremental append \ --check-column id \ --last-value 1000 \ --m 1 \ --fields-terminated-by "\001" ``` 该命令会导入 `id` 大于 1000 的新记录,适用于自增主键的情况[^1]。 #### 2. 自动记录上次同步值(Last Value) Sqoop 支持通过 `sqoop job` 的方式创建增量同步任务,它会在元数据中自动记录上一次导入的 `last-value`,无需手动指定。例如: ```bash sqoop job \ --create myjob1 \ -- import \ --connect jdbc:mysql://xxx:3306/xxx \ --username root \ --password root \ --table category \ --target-dir /user/survey/sqoop1 \ --incremental append \ --check-column id \ --last-value 1000 \ --m 1 \ --fields-terminated-by "\001" ``` 在首次执行后,后续只需运行: ```bash sqoop job --exec myjob1 ``` 即可自动使用上次的 `last-value`,实现增量更新。 #### 3. 基于时间戳字段的增量导入 当数据更新依赖时间戳字段时,可使用 `lastmodified` 模式。例如: ```bash sqoop import \ --connect jdbc:mysql://xxx:3306/xxx \ --username root \ --password root \ --table category \ --target-dir /user/survey/sqoop1 \ --incremental lastmodified \ --check-column updated_at \ --last-value "2019-06-12 12:39:43" \ --m 1 \ --fields-terminated-by "\001" ``` 该命令会导入 `updated_at` 时间戳大于 `2019-06-12 12:39:43` 的记录,适用于基于时间更新的场景[^2]。 #### 4. 使用 SQL 查询实现更灵活的增量控制 除了使用 `--incremental` 参数,还可以通过自定义 SQL 查询实现更复杂的增量逻辑。例如: ```bash sqoop import \ --connect jdbc:mysql://xxx:3306/xxx \ --username root \ --password root \ --target-dir /user/survey/sqoop1 \ --query 'SELECT * FROM category WHERE create_time >= "2023-01-01" AND $CONDITIONS' \ --split-by id \ --m 4 ``` 该方式允许使用任意 SQL 条件进行数据过滤,适用于复杂业务场景下的增量导入[^4]。 #### 5. 增量导出与更新 Sqoop 同样支持增量导出到关系型数据库,结合 `--update-mode` 和 `--update-key` 可以实现数据的更新操作。例如: ```bash sqoop export \ --connect jdbc:mysql://xxx:3306/xxx \ --username root \ --password root \ --table category \ --export-dir /user/survey/sqoop1 \ --update-mode updateonly \ --update-key id ``` 该命令会根据 `id` 字段匹配数据库记录并执行更新操作。若需要同时支持更新与插入,可使用 `allowinsert` 模式[^5]。 --- ###
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值