如何将Hadoop中的多张表批量迁移至Oracle,是否需提前建表?
Hadoop到Oracle批量表迁移常见问题解答
迁移是否必须提前在Oracle端手动创建空表?
不需要强制手动提前创建。Sqoop本身支持导出时自动建表,Spark JDBC等其他迁移工具也支持同类能力。
仅提供表名实现批量导出的方案
你可以通过Sqoop+shell脚本的方式实现批量迁移,无需人工逐个处理表,核心步骤如下:
- 第一步:整理需要迁移的表名清单,存为文本文件
table_list.txt,每行一个表名 - 第二步:编写shell循环脚本,批量调用Sqoop导出命令,开启自动建表参数
可用Sqoop导出命令示例
sqoop export \ --connect jdbc:oracle:thin:@//<Oracle主机地址>:<端口>/<服务名> \ --username <Oracle用户名> \ --password <Oracle密码> \ --table <目标Oracle表名> \ --export-dir /user/hive/warehouse/<源Hive库名>.db/<源Hive表名> \ --input-fields-terminated-by '\001' \ --create-table \ --map-column-oracle <字段名>=<目标Oracle类型>,<字段名2>=<目标Oracle类型2>
注意:
--create-table参数就是用来触发Sqoop自动在Oracle端创建对应表的配置。如果不需要自定义字段类型,可以删除--map-column-oracle参数,使用Sqoop默认的Hadoop到Oracle类型映射规则。
批量执行脚本示例
#!/bin/bash # 读取表清单循环执行导出 cat table_list.txt | while read table do sqoop export \ --connect jdbc:oracle:thin:@//10.xx.xx.xx:1521/orcl \ --username oracle_user \ --password oracle_passwd \ --table $table \ --export-dir /user/hive/warehouse/hive_db.db/$table \ --input-fields-terminated-by '\001' \ --create-table done
注意事项
- 自动建表不会同步主键、外键、索引、非空约束、默认值等表属性,如果业务需要这些配置,建议先批量生成Oracle建表语句提前创建好表再执行导出
- 默认类型映射可能存在长度不匹配问题,比如Hive的String类型默认映射为Oracle的VARCHAR2(255),如果源表有超过长度的字符串会报错,需要用
--map-column-oracle自定义映射为CLOB或者更长的VARCHAR2类型 - 如果需要更高的自定义灵活度,也可以用Spark JDBC实现导出,通过
write.jdbc的createTableColumnTypes参数自定义建表规则,性能也优于原生Sqoop
内容的提问来源于stack exchange,提问作者alex
相关产品推荐
相关产品推荐

