2016-11-04 188 views
-1

我试图使用游泳池使用下面的代码连接两个远程表(CityCountry):如何使用连接池连接表?

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')) 

而且使用另一个例子3210

sql <- "SELECT * FROM City LEFT JOIN Country ON (CountryCode=Code)" 
dbGetQuery(pool, sql) 
+1

看起来更像是一个MySQL错误消息。也许有一些方法可以查看哪些字符串正在传递给底层数据库? –

+0

@ 42-我编辑了问题和错误信息。我知道我可以使用'dplyr :: explain()'来打印mysql sintax,但在这种情况下,它只是检索我在问题中发布的同一个错误消息。 – Dambo

回答

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 ),另一个在内存/不在数据库('国家'),但可能是相反的方式。在这种情况下,xy是您的两个表格,并且错误消息只是告诉您他们不在同一个地方。通过设置copy = TRUE,将y中的小数点(临时)复制到存储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)) 

我猜想,Warningleaked pooled object涉及相同的问题(一个表是在内存中,一种是在数据库上)。