我正在尝试使用以下代码使用池连接两个远程表(City
和Country
):
pool <- dbPool(
drv = RMySQL::MySQL(),
dbname = "shinydemo",
host = "shiny-demo.csa7qlmguqrf.us-east-1.rds.amazonaws.com",
username = "guest",
password = "guest"
)
src_pool(pool) %>%
tbl('City') %>%
left_join('Country', by=c('CountryCode'='Code'))
但这是我在运行代码时遇到的错误:
Error: x and y don't share the same src.
Set copy = TRUE to copy y into x's source (this may be time consuming).
In addition: Warning message:
In force(expr) : You have a leaked pooled object. Destroying it.
下面是使用dplyr
的同一查询的工作示例:
srccon <- src_mysql(
host = "shiny-demo.csa7qlmguqrf.us-east-1.rds.amazonaws.com",
dbname = "shinydemo",
user = "guest",
password = "guest"
)
tbl(srccon, 'City') %>%
left_join(tbl(srccon, 'Country'), by=c('CountryCode'='Code'))
使用pool::dbGetQuery
sql <- "SELECT * FROM City LEFT JOIN Country ON (CountryCode=Code)"
dbGetQuery(pool, sql)
答案 0 :(得分:1)
我不熟悉池,但错误信息:
Error: x and y don't share the same src.
Set copy = TRUE to copy y into x's source (this may be time consuming).
是因为你的一个表在数据库中被操作(我猜是City
)而另一个在内存中/不在数据库中('Country'),但它可能反过来说。在这种情况下,x
和y
是您的两个表,错误消息只是告诉您它们不是同一个地方。通过设置copy = TRUE
,y
中的tibble将被(临时)复制到存储x
的任何位置(例如,存储到数据库或RAM中),以便执行计算。
你可以尝试使用dplyr::collect()
将两个对象都带入内存,这意味着连接发生在内存中;或确保两者都在您的数据库上(在这种情况下,联接将在那里发生)。
即
# Keep both in RAM
City <- tbl('City') %>% collect()
Country <- tbl('Country') %>% collect()
joined <- City %>% left_join(Country, by = c('CountryCode' = 'Code))
我猜想关于Warning
的{{1}}与同一问题有关(一个表在内存中,一个在数据库中)。