使用Futures异步收集数据库查询结果

4

我试图异步化我的dbplyr查询,但目前还没有成功:

library(dplyr)
library(tibble)
library(DBI)

con <- dbConnect(RSQLite::SQLite(), path = ":memory:")
db_flights <- copy_to(con, nycflights13::flights)

db_flights

flights_10000_df %<-% {
  db_flights %>% 
    head(10000) %>% 
    dplyr::collect()
}
#> Error in UseMethod("collect") : 
#> nicht anwendbare Methode für 'collect' auf Objekt der Klasse "list" angewendet

这里有什么问题?(对于德语错误感到抱歉)
(计划改进问题后)
1个回答

1
问题在于dbConnect中的'con'无法传递到future中,它是特定于调用它的原始R进程的。
如果您想异步地获取数据,则每个future都必须建立自己的数据库连接并使用自己的连接来提取数据。
在您的示例中,每次调用连接时它都会创建一个临时内存中的数据库,但对于真实的数据库,您可以建立连接并下载表格,但在这种情况下,future会在内存中创建一个新的数据库,显然nycflights表格不存在。
library(dplyr)
library(tibble)
library(DBI)
library(nycflights13)
library(future)

plan(multisession)

con_settings<- list(RSQLite::SQLite(), 
                    path = ":memory:")


con<- do.call(dbConnect, con_settings)

nycf<-nycflights13::flights

db_flights <- copy_to(con, nycf)
dbListTables(con)

db_flights

flights_10000_df %<-% {
  future_con<- do.call(dbConnect, con_settings)
   #return the list of tables to show that the in-memory example doesn't work correctly for this example
   dbListTables(future_con)

#below would work with a real database
#  tbl(future_con, "db_flights") %>%
#    head(1000) %>%
#    collect 

}

flights_10000_df

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接