使用com.simba.spark.jdbc42驱动连接Azure Databricks时resultset.next()方法报错问题排查
问题根源
从你提供的报错栈信息里,核心错误已经明确指向:
java.lang.IllegalStateException: Arrow only runs on LittleEndian systems.
这说明你的Unix服务器是大端(BigEndian)硬件架构,而你使用的spark.jdbc42驱动依赖的Apache Arrow库仅支持小端(LittleEndian)系统。本地JDK11环境能正常运行,是因为绝大多数个人电脑/常规服务器(x86/x86_64架构)都是小端字节序,不存在这个限制。
解决方案
针对这个问题,你可以按以下步骤尝试解决:
第一步:确认服务器字节序
先通过终端命令验证服务器的字节序类型:lscpu | grep Endian # 或者用另一种方式验证 echo $MACHTYPE如果输出包含
big-endian,就坐实了是架构导致的问题。第二步:禁用Arrow格式(最直接有效的方法)
修改你的JDBC连接URL,添加useArrow=false参数,强制驱动绕过Arrow库,改用传统的行数据解析逻辑。示例URL如下:String jdbcUrl = "jdbc:spark://<你的Databricks主机>:443/default;transportMode=http;ssl=1;httpPath=<你的HTTP路径>;AuthMech=3;UID=token;PWD=<你的令牌>;useArrow=false";这个参数会让驱动 fallback 到非Arrow的行集处理方式,彻底避开小端系统的限制。
第三步:验证驱动版本兼容性
确保你使用的spark.jdbc42驱动是与Databricks集群版本匹配的官方驱动。部分旧版本驱动对大端系统的兼容性较差,你可以尝试下载最新版的Databricks JDBC驱动替换现有版本,再配合useArrow=false参数使用。额外说明:JDK版本的影响
你本地JDK11正常、服务器JDK1.8报错,核心原因不是JDK版本,而是服务器的字节序。但如果条件允许,可以尝试将服务器的JDK升级到11版本,部分新驱动在JDK11下对非Arrow模式的支持更稳定,但这不是必须的步骤。
内容的提问来源于stack exchange,提问作者Chet

