1. 程式人生 > >sqoop2 1.99.6 中遇到問題及源碼修改匯總

sqoop2 1.99.6 中遇到問題及源碼修改匯總

sqoop 大數據 hadoop 數據預處理 sqoop2

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 hh24: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 hh24: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("%04d", 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;

}




sqoop2 1.99.6 中遇到問題及源碼修改匯總