在数据库中使用 dplyr 动词时,有没有办法在 do.call() 中附加表?

Is there a way to append tables within a do.call() when using dplyr verbs within a database?

假设有一个数据帧列表是在对某个向量进行 lapply 调用后生成的,目的是将数据帧列表附加到另一个数据帧以形成单个数据帧。在 R 中,一种方法是 do.call(rbind, data.ls),其中 data.ls 是由数据帧列表组成的列表对象。这种方法也以完全相同的方式与 dplyrbind_rows 一起使用,但当绑定两个以上的数据帧时,它不适用于 SQL 的同名 union_all .在大多数情况下,这很好,但是当在数据库环境中工作并且一个人的数据太重而无法在 lapply 调用结束之前 collect 做什么(并且有两个以上的数据帧要附加) ?这种现象也不是 dbplyr 独有的。 sparklyr 包的作者认识到 union_all 的局限性并实现了一个 sparklyr 动词来完成 rbind/bind_rows 在本地环境中所做的事情 -sdf_bind_rows。我很好奇是否有一个类似的 dplyr/dbplyr 动词可以完成或其他一些方法可以完成这个仍然依赖于 lapply 调用的结果 - 即数据帧列表。

来自 sparklyr 文档:

Description

sdf_bind_rows() and sdf_bind_cols() are implementation of the common pattern of do.call(rbind, sdfs) or do.call(cbind, sdfs) for binding many Spark DataFrames into one.

rbind 可能如下所示:

dbplyr_union_all <- function(...){
  tbl_list <- list(...)
  db_con <- list[[1]]$src$con # extract database connection

  # construct query that defines unioned table
  query_text = sapply(tbl_list, dbplyr::sql_render)
  sql_query = paste0(query_text, collapse = "\nUNION ALL\n")

  sql_query <- dbplyr::build_sql(sql_query, con = db_con)
  return(dplyr::tbl(db_con, dbplyr::sql(sql_query)))
}