使用Sqoop导入MySQL数据至HDFS时出现异常,请求排查解决
解决Sqoop导入MySQL数据时出现的
Unknown type '246'异常 问题背景
你尝试用Sqoop将MySQL test库的products表导入HDFS,执行了以下命令:
bin/sqoop-import --connect jdbc:mysql://localhost:3306/test --username root --password root --table products --target-dir /user/nitin/products
遇到了核心异常:
Caused by: java.sql.SQLException: Unknown type '246 in column 2 of 3 in binary-encoded result set.
即使添加了zeroDateTimeBehavior=convertToNull参数重新执行命令,MapReduce任务依然失败。
问题原因
错误里的类型246对应MySQL的DECIMAL/NUMERIC数据类型,这个问题通常是因为:
- Sqoop使用的MySQL JDBC驱动版本和你的MySQL服务器版本不兼容(比如老版本驱动无法识别新版本MySQL的DECIMAL编码);
- Sqoop默认的类型映射无法处理该DECIMAL字段的精度/格式。
解决方案
以下是几种可行的解决办法,按推荐优先级排序:
1. 升级/匹配MySQL JDBC驱动版本
- 先通过
SELECT VERSION();查看你的MySQL服务器版本,下载对应版本的mysql-connector-java-x.x.x.jar; - 将驱动包放到Sqoop的
lib目录下(比如$SQOOP_HOME/lib),替换掉旧的驱动文件; - 重新执行Sqoop导入命令即可。
2. 显式指定字段的Java类型映射
如果不想更换驱动,可以用--map-column-java参数强制将DECIMAL类型的字段映射为Java的String或BigDecimal类型。
假设你的products表中第2列是price DECIMAL(10,2),修改后的命令如下:
bin/sqoop-import --connect jdbc:mysql://localhost:3306/test?zeroDateTimeBehavior=convertToNull --username root --password root --table products --target-dir /user/nitin/product --map-column-java price=String
如果有多个DECIMAL字段,用逗号分隔即可:--map-column-java price=String,total=BigDecimal
3. 使用Sqoop的Direct模式导入
Direct模式会调用MySQL的mysqldump工具直接导出数据,绕开JDBC的类型解析问题。执行命令时添加--direct参数:
bin/sqoop-import --connect jdbc:mysql://localhost:3306/test?zeroDateTimeBehavior=convertToNull --username root --password root --table products --target-dir /user/nitin/product --direct
注意:需要确保集群的各个节点上都安装了mysqldump工具,并且可以正常访问到MySQL服务器。
内容的提问来源于stack exchange,提问作者Nitin Sherawat
相关产品推荐
相关产品推荐

