sqoop2 1.99.6 中遇到问题及源码修改汇总
1.当PartitionColumn的基数为1(如下图)时。则会报错
报错如下图
源代码如下
\sqoop-1.99.6-bin-hadoop200\connector\connector-generic-jdbc\src\main\java\org\apache\sqoop\connector\jdbc\GenericJdbcPartitioner.java
将源代码 改为
即可
2.Job中 参数 Null value allowed for the partition column: false 时 即使partition column 有null也不会报错,还是将为null的记录导入到HDFS中去了。
结论:不是问题,当该参数为false时,不会起pid is null 的map去导,为true时才会,所以不报错是正确的。
3.日期时间的问题,具体修改方式如下图
E:\IdeaProject\sqoop-1.99.6-bin-hadoop200\connector\connector-generic-jdbc\src\main\java\org\apache\sqoop\connector\jdbc\GenericJdbcExtractor.java
4.oracle 中 时间类型做 pid时会报错
if(JDBC_DRIVER_ORACLE.equals(jdbcDriver)){
//如果是oracle则做特殊处理
conditions.append("to_timestamp(\'").append(sdf.format((java.util.Date)lowerBound)).append("\','yyyy-mm-dd hh34:mi:ss.ff')");
conditions.append(" <= ");
conditions.append(partitionColumnName);
conditions.append(" AND ");
conditions.append(partitionColumnName);
conditions.append(lastOne ? " <= " : " < ");
conditions.append("to_timestamp(\'").append(sdf.format((java.util.Date)upperBound)).append("\','yyyy-mm-dd hh34:mi:ss.ff')");
}else{
conditions.append('\'').append(sdf.format((java.util.Date)lowerBound)).append('\'');
conditions.append(" <= ");
conditions.append(partitionColumnName);
conditions.append(" AND ");
conditions.append(partitionColumnName);
conditions.append(lastOne ? " <= " : " < ");
conditions.append('\'').append(sdf.format((java.util.Date)upperBound)).append('\'');
}
return conditions.toString();
如果是oracle 则做特殊判断。
5.当用时间作为pid时,如果时间时公元1000年以前会报错
修复方法:
--1:
/**
* 格式化公元1000年之前的时间字符串
* @param str
* @return
*/
protected String formatTime(String str) {
if(str.indexOf("-") == -1){
return str;
}else{
return String.format("d", NumberUtils.createInteger(str.split("-")[0])).concat(str.substring(str.indexOf("-")));
}
}
--2:
switch(partitionColumnType) {
case Types.DATE:
sdf = new SimpleDateFormat("yyyy-MM-dd");
minDateValue = Date.valueOf(formatTime(partitionMinValue)).getTime();
maxDateValue = Date.valueOf(formatTime(partitionMaxValue)).getTime();
break;
case Types.TIME:
sdf = new SimpleDateFormat("HH:mm:ss");
minDateValue = Time.valueOf(partitionMinValue).getTime();
maxDateValue = Time.valueOf(partitionMaxValue).getTime();
break;
case Types.TIMESTAMP:
sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
minDateValue = Timestamp.valueOf(formatTime(partitionMinValue)).getTime();
maxDateValue = Timestamp.valueOf(formatTime(partitionMaxValue)).getTime();
break;
}