出现问题:mybatis作为dao框架,利用hive-jdbc驱动,连接hive数据源,查询结果集的decimal类型数据 失去小数点后的值,导致数据精度问题。
如下是hive驱动的相关包和数据源配置
<!-- hive连接驱动开始 -->
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-client</artifactId>
<version>2.6.0</version>
</dependency>
<dependency>
<groupId>org.apache.hive</groupId>
<artifactId>hive-jdbc</artifactId>
<version>2.0.0</version>
<exclusions>
<exclusion>
<groupId>org.eclipse.jetty.aggregate</groupId>
<artifactId>jetty-all</artifactId>
</exclusion>
<exclusion>
<groupId>org.apache.hive</groupId>
<artifactId>hive-shims</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- hive连接驱动结束 -->
hive数据源配置
##hive
datasource.url=jdbc:hive2://10.10.8.107:21050/;auth=noSasl
datasource.username=
datasource.password=
datasource.driverClassName=org.apache.hive.jdbc.HiveDriver
datasource.type=hive
原因:hive-jdbc包中 org.apache.hive.jdbc.JdbcColumn 类的 columnClassName方法对 hiveType的decimal类型匹配为了javaType的BigInteger类型,因此导致了经过mybatis后类型转换后导致数据小数点后缺失,产生数据精度问题。
解决方案如下:
方案一:在当前项目中新建一个同包名类目的JdbcColumn.java,修改下图位置,将BigInteger换位BigDecimal,项目编译后,
将新生成的JdbcColumn.class 的替换hive-jdbc.jar中的 JdbcColumn.class即可。附件中保存了该文件。
方案二:改为 impala 连接驱动
1. 修改pom配置
<!-- impala 配置开始 -->
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-common</artifactId>
<version>2.6.0</version>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.hive</groupId>
<artifactId>ImpalaJDBC41</artifactId>
<version>1.0.0</version>
</dependency>
<dependency>
<groupId>pri.impala</groupId>
<artifactId>inceptor-driver</artifactId>
<version>1.0.0</version>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.thrift</groupId>
<artifactId>libfb303</artifactId>
<version>0.9.3</version>
<type>pom</type>
</dependency>
<!-- impala 配置开始 -->
2.修改数据源配置
##hive
#datasource.url=jdbc:hive2://10.10.8.107:21050/;auth=noSasl
datasource.url=jdbc:impala://10.10.8.102:21050/;auth=noSasl
datasource.username=
datasource.password=
#datasource.driverClassName=org.apache.hive.jdbc.HiveDriver
datasource.driverClassName=com.cloudera.impala.jdbc41.Driver
datasource.type=hive