ArrayIndexOutOfBoundsException: 9 spark3写入数据到hive,使用hivesql读取异常
ORC split generation failed with exception:ArrayIndexOutOfBoundsException: 9 spark3写入数据到hive,使用hivesql读取异常
1 问题起因
环境是cdh6.2.0,因为开发同事想用更高版本的算法工具,我根据网上的教程重新编译并集成了spark3,问题产生的的原因了,开发通过计算产生结果插入到hive,然后使用hivesql查询的时候报错。
原因是因为spark3使用的orc版本比cdh6的hive版本高导致的。
2 解决方法
解决方法有两种
第一个是修改hive判断orc版本的方法,使其兼容更高版本,但是有个问题,因为cdh的hive是cdh根据hive2.1.1版本魔改的,并没有开源源码,所以直接使用hive2.1.1编译出来的包会有异常,网上说是可以拿编译后的OrcFile.class文件直接替换,不过博主没有做验证。
第二种方法是修改spark3自带的orc默认的写入版本,然后自己编译替换orc-core的包。博主使用的是这种版本。
更详细的原因可以参考这个博客:ORC文件存储原理以及Spark读写ORC问题解决方法
编译orc方法如下:
先修改代码,路径为:orc/java/core/src/java/org/apache/orc/OrcFile.java
原始代码:
修改为:
然后修改orc/java下面的pom.xml的repository的源为国内源:如下
<repositories>
<repository>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>central</id>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>false</enabled>
</snapshots>
</pluginRepository>
</pluginRepositories>
在orc/java下面执行:./mvnw clean package -DskipTests 编译
完成如下截图:
在orc/java/core/target下面有编译好的orc-core-1.7.6.jar
如果不想自己编译,也可以下载我编译好的jar包:
链接:https://pan.baidu.com/s/1wH2kWCKTu_xUgAy3acyvdw
提取码:b244
更多推荐
所有评论(0)