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 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;

}


时间: 05-20

sqoop2 1.99.6 中遇到问题及源码修改汇总的相关文章

转-----在Xcode中使用Git进行源码版本控制

在Xcode中使用Git进行源码版本控制 http://www.cocoachina.com/ios/20140524/8536.html 本文翻译自Understanding Git Source Control in Xcode (译者myShire)欢迎您加入我们的翻译小组. 在应用程序开发过程中,很重要的一部分工作就是如何进行源码的版本控制.当代码出现问题时,我们就需要将代码恢复到原先正常的版本.如果是多个人共同开发一个项目,那么代码的控制就会非常复杂.幸运的是,开发者不需要自己控制这些

Apache Spark源码走读之22 -- Spark MLLib中拟牛顿法L-BFGS的源码实现

欢迎转载,转载请注明出处,徽沪一郎. 概要 本文就拟牛顿法L-BFGS的由来做一个简要的回顾,然后就其在spark mllib中的实现进行源码走读. 拟牛顿法 数学原理 代码实现 L-BFGS算法中使用到的正则化方法是SquaredL2Updater. 算法实现上使用到了由scalanlp的成员项目breeze库中的BreezeLBFGS函数,mllib中自定义了BreezeLBFGS所需要的DiffFunctions. runLBFGS函数的源码实现如下 def runLBFGS( data:

Lua中字符串类型的源码实现

    概述 Lua完全采用8位编码,Lua字符串中的字符可以具有任何数值编码,包括数值0.也就是说,可以将任意二进制数据存储到一个字符串中.Lua的字符串是不可变的值(immutable values).如果修改,实质上是新建一个字符串.根据上文<Lua中数据类型的源码实现>中知道,在Lua中,字符串是自动内存管理机制所管理的对象,并且由联合体TString来实现存储字符串值的.下面将通过Lua 5.2.1的源码来看字符串的实现以及总结了在Lua中使用字符串的注意事项.     源码实现 首

Linux中RPM包与源码包区别

1.区别 安装之前的区别:概念上的区别 安装之后的区别:安装位置不同 2.RPM包安装位置 安装在默认位置中 RPM默认安装位置 /etc/ 配置文件安装目录 /usr/bin/ 可执行的命令安装目录 /usr/lib/ 程序所使用的函数库安装目录 /usr/share/doc 基本的软件使用手册保存目录 /usr/share/man 帮助文件保存位置 3.源码包安装位置 安装在指定位置当中,一般是 /usr/local/软件名/ 4.安装位置不同带来的影响 RPM包安装的服务可以使用系统服务管

在Xcode中使用Git进行源码版本控制

在应用程序开发过程中,很重要的一部分工作就是如何进行源码的版本控制.当代码出现问题时,我们就需要将代码恢复到原先正常的版本.如果是多个人共同开发一个项目,那么代码的控制就会非常复杂.幸运的是,开发者不需要自己控制这些,因为有专门的软件来负责,叫做版本控制系统. 版本控制系统,或者说修改控制系统,实际上是一种检测源文件的改变并将其保存留作以后参考使用的机制(软件).此外,它还能记录其他有用信息,比如是哪个开发者修改了代码,何时修改的,修改了哪一部分,以及其他历史信息.版本控制系统可以比较不同版本代

Android 如何在Eclipse中查看Android API源码 及 support包源码

当我们阅读android API开发文档时候,上面的每个类,以及类的各个方法都是已经写好的方法和控件,可是我们只是在搬来使用,不知道它的原理,它是如何被实现的.android系统是开源的,所以谷歌官方在每发布一个版本的时候都会放出它对应的API源码的,让我们可以深入了解android的API实现过程,这就是开源的魅力.如果我们从API源码的角度去了解了开发过程,那样对于作为开发人员的我们,便会对他有更深入的体会,有助于日后的软件开发. 比如查看Activity的源码,如图 也可以查看系统方法怎么

Android中的ViewRootImpl类源码解析

转载请注明出处 http://blog.csdn.net/qianhaifeng2012/article/details/51737370 ViewRoot目前这个类已经没有了,是老版本中的一个类,在Android2.2以后用ViewRootImpl代替ViewRoot,对应于ViewRootImpl.java,他是链接WindowManager和DecorView的纽带,另外View的绘制也是通过ViewRootImpl来完成的. 它的主要作用我的总结为如下: A:链接WindowManage

Lua中table类型的源码实现

  1.概述 table是lua中唯一的表示数据结构的工具.它可以用于实现数据容器.函数环境(Env).元表(metatable).模块(module)和注册表(registery)等其他各种用途.因此了解table的实现是非常有必要的,根据<Lua中数据类型的源码实现>中知道,在Lua中,table是由结构体体Table来实现的.下面将以Lua 5.2.1的源码来看table的实现.   2.实现原理 在Lua5.0以后,table是以一种混合型数据结构来实现的,它包含一个哈希表部分和一个数

详细讲解Android中的Message的源码

相信大家对于Android中的Handler是在为熟悉不过了,但是要知道,Handler就其本身而言只是一个壳子,真正在内部起到作用的是Message这个类,对于Message这个类,相信大家也不会陌生,正如大家经常用到的Message.obtain()的方法一样.但是大家又是否知道obtain()方法里面为我们做了哪些操作了,下面我就带领大家进行Message的王国,去一探究竟吧. 首先映入眼帘的是这样的一行代码: ? 1 public final class Message implemen