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

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐