Sqoop HCatalog导入MySQL到Hive时类型转换异常排查与解决
Sqoop导入HCatalog表出现ClassCastException的原因与解决方法
异常原因
- 核心问题:当使用
--query参数执行自定义查询并结合HCatalog导入时,Sqoop内部的HCatalog导入逻辑未正确处理自由查询模式的参数,导致本该封装为org.apache.hive.hcatalog.mapreduce.InputJobInfo的对象被错误包装成java.util.LinkedList,触发强制类型转换异常。 - 版本兼容问题:Sqoop 1.4.6及更早版本存在该bug,对
--query与HCatalog的组合支持不完善。
解决方法
方法一:替换--query为--table+--where(优先推荐)
如果自定义查询仅涉及原表字段过滤或指定字段导出,可改用--table指定源表,配合--where添加过滤条件,避免触发bug:
sqoop import -connect jdbc:mysql://master:3306/*** --username **** --password **** \ --table web_chat_text_ems_2019_07 \ --where "1=1" \ --columns "id,referrer,from_url,landing_page_url,url_title,platform_description,other_params,history" \ --hcatalog-database itcast_ods --hcatalog-table web_chat_text_ems_ods \ -m 10 --split-by id
说明:--columns参数用于指定需要导入的字段,与原查询的字段列表完全匹配即可。
方法二:升级Sqoop版本
将Sqoop升级至1.4.7及以上版本,官方已修复该类型转换bug,升级后可直接使用原--query命令执行导入。
方法三:分两步导入(临时绕过)
若无法升级版本且必须使用自定义查询,可先将数据导入HDFS,再从HDFS同步至HCatalog表:
- 从MySQL导入HDFS:
sqoop import -connect jdbc:mysql://master:3306/*** --username **** --password **** \ --query "select id,referrer,from_url,landing_page_url,url_title,platform_description,other_params,history from web_chat_text_ems_2019_07 where 1=1 and $CONDITIONS" \ -m 10 --split-by id \ --target-dir /tmp/web_chat_temp \ --fields-terminated-by '\001'
- 从HDFS导入HCatalog表:
sqoop import --connect jdbc:hive2://master:10000/ --username hive --password hive \ --table itcast_ods.web_chat_text_ems_ods \ --target-dir /tmp/web_chat_temp \ --fields-terminated-by '\001'
说明:确保HDFS文件的字段分隔符与HCatalog表的存储格式一致,默认HCatalog使用\001作为字段分隔符。
内容的提问来源于stack exchange,提问作者DylanGong
相关产品推荐
相关产品推荐

