【问题标题】:Snowflake through R/RJDBC - Unable to retrieve JDBC result set雪花通过 R/RJDBC - 无法检索 JDBC 结果集
【发布时间】:2021-12-28 14:46:56
【问题描述】:

我安装了最新的 Java,使用 Windows 命令提示符进行检查

java --version

C:\Users\sweepydodo>java --version
java 17.0.1 2021-10-19 LTS
Java(TM) SE Runtime Environment (build 17.0.1+12-LTS-39)
Java HotSpot(TM) 64-Bit Server VM (build 17.0.1+12-LTS-39, mixed mode, sharing)

我已经运行了以下

library(RJDBC)

drv <- JDBC(driverClass = "net.snowflake.client.jdbc.SnowflakeDriver"
            , classPath = "C:/Users/sweepydodo/Documents/R/snowflake-jdbc-3.13.9.jar"
            , identifier.quote = "`"
            )

con <- dbConnect(drv, "jdbc:snowflake://gs46004.eu-west-1.snowflakecomputing.com:443?warehouse=prd_wh&ROLE=prod_readonly&authenticator=externalbrowser&database=dwh_db", "sweepydodo@abc.com", "dummy password")

R 控制台然后读取

Nov 17, 2021 3:37:01 PM net.snowflake.client.core.CredentialManager fillCachedCredential
INFO: JNA jar files are needed for Secure Local Storage service. Please follow the Snowflake JDBC instruction for Secure Local Storage feature. Fall back to normal process.
Initiating login request with your identity provider. A browser window should have opened for you to complete the login. If you can't see it, check existing browser windows, or your OS settings. Press CTRL+C to abort and try again...

然后它会打开一个带有白色背景和一行内容的浏览器窗口:

您的身份已确认并传播到 Snowflake JDBC 驱动程序。 您现在可以关闭此窗口并返回您开始的位置。

然后我回到 R 并跑了

dbListTables(con)                 # list all tables

一切正常,我看到了一个表格列表。当我运行实际查询时,我的问题就出现了:

dbGetQuery(con,
           "
           select  *
           from    FACT_VISIT
           limit   10
           "
           )

错误读取

Error in .verify.JDBC.result(r, "Unable to retrieve JDBC result set",  : 
  Unable to retrieve JDBC result set
  JDBC ERROR: SQL compilation error:
Object 'FACT_VISIT' does not exist or not authorized.
  Statement: 
                select  *
                from    FACT_VISIT
                limit   10

我觉得很奇怪,我可以使用dbListTables(con) 查看表列表,但无法查询任何表。我期待任何想法/解决方案。

【问题讨论】:

  • 该错误清楚地表明您无权访问该表。您是否能够使用与脚本中相同的用户/角色/数据库/模式从 Snowflake UI 运行相同的 SELECT?我没有在您的连接字符串中看到模式集,因此我认为它是公共的,默认的,这可能会导致问题。
  • 谢谢@Sergiu 事实证明,不仅缺少表的前缀(数据库名称和方案)。最大的问题是JavaSnowflake 的jar 文件的版本不正确。我将发布详细的答案。不过,谢谢。

标签: java r database snowflake-cloud-data-platform rjdbc


【解决方案1】:

经过一天的搜索和同事的帮助,我们发现罪魁祸首是 Java 的最新版本 jdk-17_windows-x64_bin 和 Snowflake 的最新版本之一 3.13.9 的组合。

有效的是原始帖子中描述的所有内容,但使用来自here 的Java 11.0.12 和来自heresnowflake-jdbc-3.10.3.jar

来自 Java 和 Snowflake 的 .jar 的最新版本一起将为您带来here 概述的问题。

最后,正如@Sergiu 指出的那样。在 SQL 查询中,我还应该明确指定数据库和方案名称。

dbGetQuery(con,
           "
           select  *
           from    dwh_db.visitor.fact_visit
           limit   10
           "
           )

【讨论】:

    猜你喜欢
    • 2017-08-03
    • 2021-11-21
    • 1970-01-01
    • 2020-12-24
    • 2019-01-08
    • 2020-11-29
    • 1970-01-01
    • 2021-02-22
    • 1970-01-01
    相关资源
    最近更新 更多