r语言 - 如何使用池包转义 Athena database.table?



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

到目前为止有效的方法:

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.myTabletbl(),但没有成功:

我尝试使用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"

您可以使用dbplyr::in_schema

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

最新更新