雪花 JDBC 驱动程序内部错误:无法检索第一个箭头块的行数:null - 仅发生在 SELECT 语句上
Posted
技术标签:
【中文标题】雪花 JDBC 驱动程序内部错误:无法检索第一个箭头块的行数:null - 仅发生在 SELECT 语句上【英文标题】:Snowflake JDBC driver internal error: Fail to retrieve row count for first arrow chunk: null -- only occurs on SELECT statements 【发布时间】:2021-07-28 06:27:03 【问题描述】:我已经成功建立了JDBC连接,可以成功执行“使用仓库...”之类的语句。当我尝试运行任何 SELECT 语句时,我收到以下错误:
net.snowflake.client.jdbc.SnowflakeSQLLoggedException:JDBC 驱动程序内部错误:无法检索第一个箭头块的行数:null。
我可以看到我的请求成功,并在雪花 UI 中返回了预期的数据。
错误发生在这一行: rs = statement.executeQuery("select TOP 1 EVENT_ID from snowflake.account_usage.login_history");
该语句能够在此行之前执行查询,并且结果集符合预期。任何见解将不胜感激!
【问题讨论】:
只有那个查询失败?表中的其他选择呢? 【参考方案1】:这可能有几个原因:
您使用的是什么 JDK 版本? JDK16 引入了对 JDK 内部的强封装(参见JEP 396) 如果您使用的是 JDK16,请尝试在启动时在 JVM 级别设置:
-Djdk.module.illegalAccess=permit
这是一种解决方法,直到我们解决了以下 Apache Arrow 问题 ARROW-12747
如果您使用使用 JDBC 连接到 Snowflake 的应用程序,则该应用程序可能无法正确解释结果。尝试切换回 JSON 而不是 ARROW 格式,看看是否可以修复它。这可以通过运行在会话级别完成:
ALTER SESSION SET JDBC_QUERY_RESULT_FORMAT='JSON'
【讨论】:
嗨,你能解释一下-Djdk.module.illegalAccess=permit
的作用吗?我在 Arch linux 的 dbeaver 中遇到了同样的问题,java 16 openjdk 连接到雪花。如果您可以解释更多关于选项 1 的信息,以及 JDKs above 11 might cause unexpected behavior
的含义,这将使这个答案更加完整和有用。
@scientific_explorer 我已经编辑了答案,谢谢指出。
@sergiu 谢谢你的回答。但是,对于我们这些使用 R 的雪花驱动程序的人来说,这有点问题,因为我们无法在启动时指定 jvm 级别或更改会话,这意味着我们必须在系统范围内降级我们的 jvm 版本才能获得连接。我们是否希望在箭头兼容性问题上尽快取得进展?
@Bob 箭头问题已直接向 Apache 开放,因此我们正在等待他们的反馈。【参考方案2】:
我遇到了同样的问题,并且能够通过降级到 Java 11 版本来使其正常工作
[net.snowflake/snowflake-jdbc "3.13.8"]
【讨论】:
我也遇到了同样的问题。只有我将 R 连接到雪花。我已经尝试过您的解决方案(将 Java 降级到11.0.13
和 Snowflake .jar
到 3.13.8
。我能够运行 dbListTables(con)
并看到一个表列表但是在运行查询时,例如 dbGetQuery(con, "select * from table limit 10")
我得到了下面的错误
Note: method with signature ‘DBIConnection#character’ chosen for function ‘dbListFields’, target signature ‘JDBCConnection#character’. "JDBCConnection#ANY" would also be valid Error in .verify.JDBC.result(r, "Unable to retrieve JDBC result set", : Unable to retrieve JDBC result set JDBC ERROR: SQL compilation error: Object '"dwh_db.visitor.table"' does not exist or not authorized. Statement: SELECT * FROM "dwh_db.visitor.table" LIMIT 0
使用Java
和Snowflake
的.jar 文件link 的特定版本组合解决以上是关于雪花 JDBC 驱动程序内部错误:无法检索第一个箭头块的行数:null - 仅发生在 SELECT 语句上的主要内容,如果未能解决你的问题,请参考以下文章
雪花 jdbc 中的 secretkeyfactory 不可用错误
为啥雪花 jdbc 会抛出 [XX000][200001] 错误