【问题标题】:How to escape Athena database.table using pool package?如何使用 pool 包逃脱 Athena database.table?
【发布时间】:2018-06-18 19:48:05
【问题描述】:

我正在尝试通过 JDBC 和 pool 连接到 Amazon Athena:

到目前为止的效果:

library(RJDBC)
library(DBI)
library(pool)
library(dplyr)
library(dbplyr)

drv <- RJDBC::JDBC('com.amazonaws.athena.jdbc.AthenaDriver', '/opt/jdbc/AthenaJDBC41-1.1.0.jar')

pool_instance <- dbPool(
  drv = drv,
  url = "jdbc:awsathena://athena.us-west-2.amazonaws.com:443/",
  user = "me",
  s3_staging_dir = "s3://somedir",
  password = "pwd"
)

mydata <- DBI::dbGetQuery(pool_instance, "SELECT * 
                                          FROM myDB.myTable
                                          LIMIT 10")

mydata

---> 工作正常。正在返回正确的数据。

这不起作用:

pool_instance %>% tbl("myDB.myTable") %>% head(10)
# Error in .verify.JDBC.result(r, "Unable to retrieve JDBC result set for ",  : 
#   Unable to retrieve JDBC result set for SELECT *
# FROM "myDB.myTable" AS "zzz2"
# WHERE (0 = 1) ( Table myDB.myTable not found. Please check your query.)

这里的问题是 Athena 期望以下语法为 SQL:

要么:

SELECT *
FROM "myDB"."myTable"

或者:

SELECT *
FROM myDB.myTable

所以基本上,通过传递字符串"myDB.myTable":

pool_instance %>% tbl("myDB.myTable") %>% head(10)

正在使用以下语法:

SELECT *
FROM "myDB.myTable"

由于此类表不存在,因此导致以下错误:

# Error in .verify.JDBC.result(r, "Unable to retrieve JDBC result set for ",  : 
#  Unable to retrieve JDBC result set for SELECT *
# FROM "myDB.myTable" AS "zzz6"
# WHERE (0 = 1) ( Table myDB.myTable not found. Please check your query.)

我尝试过的:

因此,我尝试将 "myDB"."myTable"myDB.myTable 传递给 tbl() 均未成功:

我尝试过使用capture.output(cat('\"myDB\".\"myTable\"')):

pool_instance %>% tbl(capture.output(cat('\"myDB\".\"myTable\"'))) %>% head(10)
# Error in .verify.JDBC.result(r, "Unable to retrieve JDBC result set for ",  : 
#   Unable to retrieve JDBC result set for SELECT *
# FROM """myDB"".""myTable""" AS "zzz4"
# WHERE (0 = 1) ( Table ""myDB"".""myTable"" not found. Please check your query.)

pool_instance %>% tbl(noquote("myDB"."myTable") %>% head(10)
# Error in UseMethod("as.sql") : 
#   no applicable method for 'as.sql' applied to an object of class "noquote"

【问题讨论】:

    标签: r database dbplyr


    【解决方案1】:

    你可以使用dbplyr::in_schema:

    pool_instance %>% tbl(in_schema("myDB", "myTable")) %>% head(10)
    

    【讨论】:

    • 嗨@Scarabee,感谢您的回答。您是否曾经尝试过将dbListFields(pool, tbl) 与in_schema 一起使用,从上述JDBC 连接中返回dbListFields(pool, tbl(in_schema("myDB", "myTable"))) 之类的字段?
    • @Googme:不,我从未尝试过,而且我现在没有必要的环境来测试它。对不起!
    猜你喜欢
    • 2019-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-31
    • 2016-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多