原因:sqoop解析sql时,直接取的数据库字段的名字,没有取别名。不过sqoop为什么这么做,尚不清楚。
解决方案:修改文件:org.apache.sqoop.manager.SqlManager.java
找到getColumnNamesForRawQuery(String stmt)方法;
找到如下代码
String colName = metadata.getColumnName(i);
if (colName == null || colName.equals("")){
colName = metadata.getColumnLabel(i);
}
改为:
String colName =metadata.getColumnLabel(i);
if (colName == null || colName.equals("")) {
colName = metadata.getColumnName(i);
}
找到getColumnTypesForRawQuery(String stmt)方法;
同样:
找到如下代码
String colName = metadata.getColumnName(i);
if (colName == null || colName.equals("")){
colName = metadata.getColumnLabel(i);
}
改为:
String colName =metadata.getColumnLabel(i);
if (colName == null || colName.equals("")) {
colName = metadata.getColumnName(i);
}
重新编译项目,用新编译的该类替换sqoop-1.4.3-cdh4.4.0.jar包中类。并替换sqoop的根目录下的该jar包。问题解决!
本文主要通过对sqoop的远程debug跟踪定位解决的该问题,具体远程debug方法如下:
http://blog.csdn.net/exception_ex/article/details/17166225
注:本文是针对sqoop-1.4.3-cdh4.4.0.jar包进行分析,具体到其他版本需要具体进行测试。