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


转自:https://blog.csdn.net/qq_35495339/article/details/95620740
原文地址:https://www.cnblogs.com/javalinux/p/14944418.html