在数据库中使用 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
是由数据帧列表组成的列表对象。这种方法也以完全相同的方式与 dplyr
的 bind_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)))
}
假设有一个数据帧列表是在对某个向量进行 lapply
调用后生成的,目的是将数据帧列表附加到另一个数据帧以形成单个数据帧。在 R 中,一种方法是 do.call(rbind, data.ls)
,其中 data.ls
是由数据帧列表组成的列表对象。这种方法也以完全相同的方式与 dplyr
的 bind_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)))
}