数仓必会:Sqoop常用命令(全量/增量/全库同步)

官方文档:Sqoop User Guide (v1.4.7)

还有很多其他参数如:分隔符,文件格式,编码等参数在下面没有具体列举出来,可根据实际需要按需配置。

查看RDBMS的所有库

# MySQL:   jdbc:mysql://HOST:PORT
sqoop-list-databases --connect jdbc:mysql://127.0.0.1:3306 --username u_wyk --password p_wyk

# Oracle:  jdbc:oracle:thin:@HOST:PORT:SID
sqoop-list-databases --connect jdbc:oracle:thin:@127.0.0.1:1521:csdn --username u_wyk --password p_wyk

查看RDBMS指定库下的所有表

# MySQL:  jdbc:mysql://HOST:PORT/DB
sqoop-list-tables --connect jdbc:mysql://127.0.0.1:3306/csdn --username u_wyk --password p_wyk

# Oracle: jdbc:oracle:thin:@HOST:PORT:SID
sqoop-list-tables --connect jdbc:oracle:thin:@127.0.0.1:1521:csdn --username u_wyk --password p_wyk

测试RDBMS连通性

控制台显示结果

sqoop eval --connect "jdbc:mysql://127.0.0.1:3306/csdn?zeroDateTimeBehavior=CONVERT_TO_NULL" --query "select *  from t_test limit 1" --username u_wyk --password p_wyk

替换空值和空字符串

# 字符串null值和非字符串null值都转为NULL
# 使用--null-string和--null-non-string指定'\\N'
sqoop ...
--null-string
'\\N'
--null-non-string
'\\N'

# 同时在hive中指定空值格式为'\\N'
alter table table_name SET SERDEPROPERTIES('serialization.null.format' = '\\N');

替换/删除特殊字符

# 将数据中的 特殊字符\u001和 回车换行符\n\r 替换成指定字符串
sqoop ...
--hive-delims-replacement ''

# 将数据中的 特殊字符\u001和 回车换行符\n\r 删除
sqoop ...
--hive-drop-import-delims

RDBMS全库同步到Hive

# 将指定库下的表全量同步到hive库内(自动建表,需要提前建好hive库)
sqoop import-all-tables --connect "jdbc:mysql://127.0.0.1:3306/csdn?zeroDateTimeBehavior=CONVERT_TO_NULL" --username u_wyk --password p_wyk --hive-import --hive-overwrite --hive-database hive_csdn  -m 5

# 如果有表没有主键,则无法切分并行任务,使用参数--autoreset-to-one-mapper 自动将其变成1个mapper任务
sqoop import-all-tables --connect "jdbc:mysql://127.0.0.1:3306/csdn?zeroDateTimeBehavior=CONVERT_TO_NULL" --username u_wyk --password p_wyk --hive-import --hive-overwrite --hive-database hive_csdn --autoreset-to-one-mapper -m 5

RDBMS全库同步到HDFS

# 将指定库下的表全量同步到HDFS库内
sqoop import-all-tables --connect "jdbc:mysql://127.0.0.1:3306/csdn?zeroDateTimeBehavior=CONVERT_TO_NULL" --username u_wyk --password p_wyk --warehouse-dir "/path/to/csdn_db"  -m 5

# 如果有表没有主键,则无法切分并行任务,使用参数--autoreset-to-one-mapper 自动将其变成1个mapper任务
sqoop import-all-tables --connect "jdbc:mysql://127.0.0.1:3306/csdn?zeroDateTimeBehavior=CONVERT_TO_NULL" --username u_wyk --password p_wyk --warehouse-dir "/path/to/csdn_db" --autoreset-to-one-mapper -m 5

复制RDBMS表结构到Hive

仅根据RDBMS表结构创建Hive表,不同步数据

# 从MySQL库csdn中复制表source_table 的表结构,在hive中建表default.target_table
sqoop create-hive-table --connect "jdbc:mysql://127.0.0.1:3306/csdn?zeroDateTimeBehavior=CONVERT_TO_NULL"  --username u_wyk -–password p_wyk -–table source_table --hive-database default -–hive-table target_table

RDBMS全量同步到Hive

# 从MySQL数据库csdn同步表source_table到hive的default.target_table,自动建表
sqoop-import --connect 'jdbc:mysql://127.0.0.1:3306/csdn?serverTimezone=Asia/Shanghai&zeroDateTimeBehavior=CONVERT_TO_NULL' --username u_wyk --password p_wyk --table source_table --hive-import --hive-overwrite  --hive-table default.target_table --null-string '\\N' --null-non-string '\\N' -m 5

RDBMS全量同步到HDFS

# 从MySQL数据库csdn同步表source_table到HDFS的/path/to/target_dir目录下
sqoop-import --connect 'jdbc:mysql://127.0.0.1:3306/csdn?zeroDateTimeBehavior=CONVERT_TO_NULL&useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai' --username u_wyk --password p_wyk --table source_table --target-dir /path/to/target_dir -m 5

RDBMS增量同步到Hive

# 创建一个sqoop任务:根据增量字段upd_ts,记录上一次的最大值,每次同步大于该值的数据增量同步数据至hive,创建任务后每次执行会自动更新--last-value的值
sqoop job --create wyk_csdn_job --import --connect 'jdbc:mysql://127.0.0.1:3306/csdn?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=CONVERT_TO_NULL' --username u_wyk --password p_wyk --table source_table  --target-dir=/path/to/target_table --hive-import --hive-database default --hive-table target_table --incremental append --check-column upd_ts --last-value '2020-11-30 00:00:00'

# 使用下面的命令执行该任务
sqoop job --exec wyk_csdn_job 

# 删除任务
sqoop job --delete wyk_csdn_job 

RDBMS增量同步到HDFS

# 根据upd_ts增量处理,记录上一次的最大值,取大于该值的数据进行同步
sqoop job --create wyk_csdn_job --import --connect 'jdbc:mysql://127.0.0.1:3306/csdn?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=CONVERT_TO_NULL' --username u_wyk --password p_wyk --table source_table  --target-dir=/path/to/target_table --incremental append --check-column upd_ts --last-value '2020-11-30 00:00:00'

# 或者使用 SQL+shell 结合的方式将增量数据放置在HDFS路径下
sqoop-import --connect 'jdbc:mysql://127.0.0.1:3306/csdn?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=CONVERT_TO_NULL'  --username u_wyk  --password p_wyk  --query 'SELECT * FROM csdn.source_table WHERE datediff(upd_ts,current_timestamp())<=3  AND $CONDITIONS'  --incremental append  --check-column id  --target-dir /path/to/target_table  --null-string '\\N'  --null-non-string '\\N' -m 5

HDFS全量同步到RDBMS

# 从HDFS中导出数据到MySQL表rdbms_table内(表需要提前创建)
sqoop export –-connect 'jdbc:mysql://127.0.0.1:3306/csdn?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=CONVERT_TO_NULL' -–username u_wyk –-password p_wyk -–table rdbms_table –-export-dir /path/to/hive_table

HDFS增量同步到RDBMS

--update-mode: 

   allowinsert :插入更新,等同于upsert操作。

   updateonly:更新,仅更新主键冲突的数据,新数据不做任何处理。

# 增量将HDFS数据导出至MySQL的rdbms_table表,按照id(若多个主键可以用逗号分隔)进行插入更新upsert(表需要提前创建)
sqoop export –-connect 'jdbc:mysql://127.0.0.1:3306/csdn?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=CONVERT_TO_NULL' -–username u_wyk –-password p_wyk -–table rdbms_table --update-key id --update-mode allowinsert –-export-dir /path/to/hive_table/pt=20201130

# 增量将HDFS数据导出至MySQL的rdbms_table表,按照id(若多个主键可以用逗号分隔)进行更新update(若主键冲突则更新,新数据不做任何操作)(表需要提前创建)
sqoop export –-connect 'jdbc:mysql://127.0.0.1:3306/csdn?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=CONVERT_TO_NULL' -–username u_wyk –-password p_wyk -–table rdbms_table --update-key id --update-mode updateonly –-export-dir /path/to/hive_table/pt=20201130

希望本文对你有帮助,请点个赞鼓励一下作者吧~ 谢谢

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

王义凯_Rick

遇见即是缘,路过就给个评论吧~

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

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

打赏作者

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

抵扣说明:

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

余额充值