4

我正在尝试异步化我的 dbplyrs 查询,但目前它不起作用:

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

这里有什么问题?(对不起德语错误)

(计划稍后改进问题)

4

1 回答 1

1

问题是dbConnect“骗局”不能传递给未来。它特定于调用它的原始 R 进程。

如果你想异步拉取数据,每个未来都必须建立自己的数据库连接并使用它自己的连接来拉取数据。

在您的示例中,每次调用连接时都会在内存中创建一个临时数据库,但是对于真正的数据库,您可以建立连接并下载表,但是在这种情况下,未来会在内存中创建一个新数据库,显然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
于 2022-01-31T22:58:21.737 回答