Sqoop导出模式——全量、增量insert、更新update的介绍以及脚本示例

本文介绍了使用SQOOP从Hive表导出数据到RDBMS的不同模式,包括全量导出、增量导出及更新导出,并提供了具体的HQL与SQOOP脚本示例。

背景信息

SQOOP支持直接从Hive表到RDBMS表的导出操作,也支持HDFS到RDBMS表的操作,

当前需求是从Hive中导出数据到RDBMS,有如下两种方案:

Ø  从Hive表到RDBMS表的直接导出:

该种方式效率较高,但是此时相当于直接在Hive表与RDBMS表的数据之间做全量、增量和更新对比,当Hive表记录较大时,或者RDBMS有多个分区表时,无法做精细的控制,因此暂时不考虑该方案。

Ø  从HDFS到RDBMS表的导出:

该方式下需要先将数据从Hive表导出到HDFS,再从HDFS将数据导入到RDBMS。虽然比直接导出多了一步操作,但是可以实现对数据的更精准的操作,特别是在从Hive表导出到HDFS时,可以进一步对数据进行字段筛选、字段加工、数据过滤操作,从而使得HDFS上的数据更“接近”或等于将来实际要导入RDBMS表的数据。在从HDFS导入RDBMS时,也是将一个“小数据集”与目标表中的数据做对比,会提高导出速度。示意图如下所示:


不同导出模式介绍

全量导出

Ø  应用场景:将Hive表中的全部记录(可以是全部字段也可以部分字段)导出到目标表。

Ø  实现逻辑:


Ø  使用限制:目标表中不能有与Hive中相同的记录,一般只有当目标表为空表时才使用该模式进行首次数据导出。

Ø  参数:源表、目标表、导出字段(select的字段)、映射关系(--column后的参数)

Ø  适用的数据库:Oracle、DB2、SQL Server、PG、MySQL

增量导出

Ø  应用场景:将Hive表中的增量记录以及有修改的记录同步到目标表中。

Ø  实现逻辑:


Ø  使用限制:update-key可以是多个字段,但这些字段的记录都应该是未被更新过的,若该参数指定的字段有更新,则对应记录的更新不会被同步到目标表中。

Ø  参数:源表、目标表、筛选字段及其取值范围、导出字段(select的字段)、映射关系(--column后的参数)、更新的参考字段(--update-key后的参数)

Ø  适用的数据库:Oracle、SQL Server、MySQL

更新导出

Ø  应用场景:将Hive表中的有更新的记录同步到目标表。

Ø  实现逻辑:


Ø  使用限制:update-key可以是多个字段,但这些字段的记录都应该是未被更新过的,若该参数指定的字段有更新,则对应记录的更新不会被同步到目标表中。

Ø  参数:源表、目标表、筛选字段及其取值范围、导出字段(select的字段)、映射关系(--column后的参数)、更新的参考字段(--update-key后的参数)

Ø  适用的数据库:Oracle、DB2、SQL Server、PG、MySQL

相关脚本




全量导出
HQL示例:insert overwrite  directory ‘/user/root/export/test’ row format delimited fields terminated by ‘,’ STORED AS textfile select F1,F2,F3 from <sourceHiveTable>;

SQOOP脚本:sqoop export --connect jdbc:mysql://localhost:3306/wht --username root --password cloudera --table <targetTable> --fields-terminated-by ','  --columns F1,F2,F3 --export-dir /user/root/export/test

增量导出(insert模式)
HQL示例:insert overwrite  directory ‘/user/root/export/test’ row format delimited fields terminated by ‘,’ STORED AS textfile select F1,F2,F3 from <sourceHiveTable> where <condition>;

SQOOP脚本:sqoop export --connect jdbc:mysql://localhost:3306/wht --username root --password cloudera --table <targetTable> --fields-terminated-by ‘,’  --columns F1,F2,F3 --update-key F4 --update-mode  allowinsert --export-dir /user/root/export/test


更新导出(update模式)
HQL示例:insert overwrite  directory ‘/user/root/export/test’ row format delimited fields terminated by ‘,’ STORED AS textfile select F1,F2,F3 from <sourceHiveTable> where <condition>;

SQOOP脚本:sqoop export --connect jdbc:mysql://localhost:3306/wht --username root --password cloudera --table <targetTable> --fields-terminated-by ‘,’  --columns F1,F2,F3 --update-key F4 --update-mode  updateonly --export-dir /user/root/export/test
# Sqoop 中的增量全量导入策略 ## 全量导入 (Full Import) **概念**:每次导入时都会导入整张表的所有数据,不考虑之前是否已经导入过。 **特点**: - 简单直接,适合小数据量或需要完全刷新数据的场景 - 每次执行都会重新导入所有数据 - 资源消耗大,不适合大数据量表 **基本语法**: ```bash sqoop import \ --connect jdbc:mysql://hostname:port/database \ --username user \ --password pass \ --table source_table \ --target-dir /hdfs/path/target_dir \ --delete-target-dir ``` ## 增量导入 (Incremental Import) **概念**:只导入自上次导入以来新增或修改的数据,Sqoop 支持两种增量模式。 ### 1. Append 模式 **适用场景**:只追加新增记录,不修改已有记录(如日志表、交易流水表) **特点**: - 基于自增ID或时间戳字段 - 只导入大于上次导入最大值的记录 **基本语法**: ```bash sqoop import \ --connect jdbc:mysql://hostname:port/database \ --username user \ --password pass \ --table source_table \ --target-dir /hdfs/path/target_dir \ --incremental append \ --check-column id \ # 用于检查增量变化的列 --last-value 1000 # 上次导入的最大值 ``` ### 2. Lastmodified 模式 **适用场景**:需要跟踪记录修改的场景(如用户信息表) **特点**: - 基于时间戳字段 - 导入大于上次导入时间的记录 - 可配合`--merge-key`实现更新操作 **基本语法**: ```bash sqoop import \ --connect jdbc:mysql://hostname:port/database \ --username user \ --password pass \ --table source_table \ --target-dir /hdfs/path/target_dir \ --incremental lastmodified \ --check-column update_time \ # 时间戳字段 --last-value "2023-01-01 00:00:00" \ --merge-key id # 用于合并重复记录的主键 ``` ## 增量全量对比 | 特性 | 全量导入 | 增量导入 | |------|---------|---------| | 数据完整性 | 每次完整数据 | 只含新增/修改数据 | | 性能 | 资源消耗大 | 资源消耗小 | | 适用场景 | 小表/首次导入 | 大表/定期同步 | | 存储需求 | 每次全量存储 | 只存储增量部分 | | 实现复杂度 | 简单 | 需维护检查点和合并策略 | ## 最佳实践建议 1. **首次导入**使用全量模式建立基线数据 2. **后续同步**使用增量模式减少传输量 3. 对**频繁更新的表**考虑使用`lastmodified`模式 4. 对**只追加不修改的表**使用`append`模式 5. 定期(如每月)执行一次全量导入校验数据一致性
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

汀桦坞

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值