Sqoop导出Hive String至Oracle CLOB失败,求解决方案
Hive String类型数据导出到Oracle CLOB字段失败的解决方法
场景
Hive侧建表语句
[Hive side] create table TEST.HIVE_TEST ( CONTENT string) stored as textfile;
Oracle侧建表语句
[oracle side] create table TEST.ORACLE_TEST ( CONTENT clob);
执行的Sqoop导出命令(原命令存在语法错误)
[sqoop export] /usr/bin/sqoop export \ --connect "connection string" --username "ex" password "ex" \ --table ORACLE_TEST \ --columns CONTENT \ --hcatalog-table HIVE_TEST --hcatalog-database TEST \ --map-column-java CONTENT=String
问题现象
- MapReduce任务显示执行成功,但YARN应用日志存在报错:
ERROR [main] org.apache.sqoop.mapreduce.hcat.SqoopHCatExportHelper : cannot convert hcatalog object of type string to java object type org.apache.sqoop.lib.clobref
- Oracle数据库中的
CONTENT字段值全部为null。
环境信息
- Sqoop版本:Sqoop-1.4.7-cdh6.3.4
解决步骤
- 修正命令语法错误:原命令中
password参数缺少--前缀,必须改为--password "ex",否则参数解析异常会导致数据导出失败。 - 添加Oracle字段类型映射:使用
--map-column-oracle CONTENT=CLOB参数,明确指定Oracle侧的字段类型为CLOB,让Sqoop正确处理Hive String到Oracle CLOB的类型转换,同时保留--map-column-java CONTENT=String确保Hive侧的类型映射正确。 - 确保Oracle驱动版本兼容:使用与Oracle数据库版本匹配的ojdbc驱动(如ojdbc6或ojdbc8),放置在
$SQOOP_HOME/lib目录下,旧版本驱动可能对CLOB类型支持存在问题。 - 调整后的完整Sqoop命令:
/usr/bin/sqoop export \ --connect "connection string" \ --username "ex" \ --password "ex" \ --table TEST.ORACLE_TEST \ --columns CONTENT \ --hcatalog-table HIVE_TEST \ --hcatalog-database TEST \ --map-column-java CONTENT=String \ --map-column-oracle CONTENT=CLOB
- 可选优化:如果导出的文本内容较大,可添加
--direct参数启用Oracle直接导出模式提升性能,但需确保执行用户拥有Oracle直接导出权限。
内容的提问来源于stack exchange,提问作者are123
相关产品推荐
相关产品推荐

