如何使用池连接来连接表?

时间:2016-11-04 05:18:55

标签: mysql r shiny dplyr

我正在尝试使用以下代码使用池连接两个远程表(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'))

使用pool::dbGetQuery

的另一个例子
sql <- "SELECT * FROM City LEFT JOIN Country ON (CountryCode=Code)"
dbGetQuery(pool, sql)

1 个答案:

答案 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'),但它可能反过来说。在这种情况下,xy是您的两个表,错误消息只是告诉您它们不是同一个地方。通过设置copy = TRUEy中的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}}与同一问题有关(一个表在内存中,一个在数据库中)。