Есть ли способ добавить таблицы в do.call() при использовании глаголов dplyr в базе данных?

Скажем, есть список кадров данных, который генерируется после вызова lapply для некоторого вектора, и цель состоит в том, чтобы добавить список кадров данных друг к другу, чтобы сформировать один кадр данных. В R одним из подходов является do.call(rbind, data.ls), где data.ls — это объект списка, состоящий из списка фреймов данных. Этот подход также работает с bind_rows dplyr точно так же, но он НЕ работает с одноименным union_all SQL, когда один связывает более двух фреймов данных. В большинстве случаев это нормально, но что делать, когда вы работаете в среде базы данных, и ваши данные слишком тяжелы для collect до конца вызова lapply (и нужно добавить более двух фреймов данных)? Это явление также не уникально для dbplyr. Авторы пакета sparklyr осознали ограничения пакета union_all и реализовали глагол sparklyr, выполняющий то, что rbind/bind_rows делает в локальной среде -sdf_bind_rows. Мне любопытно, есть ли аналогичный глагол dplyr/dbplyr для выполнения или какой-либо другой подход, который может выполнить это, который все еще зависит от результатов вызова lapply -т.е. список фреймов данных.

Из документации sparklyr:

Описание

sdf_bind_rows() и sdf_bind_cols() являются реализацией общего шаблона do.call(rbind, sdfs) или do.call(cbind, sdfs) для связывания множества фреймов данных Spark в один.


person Cyrus Mohammadian    schedule 27.02.2020    source источник
comment
Если x - это ваш список фреймов данных, может быть что-то вроде purrr::reduce(x, union_all)?   -  person Bas    schedule 27.02.2020


Ответы (1)


Возможно, что-то вроде следующего для 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)))
}
person Simon.S.A.    schedule 27.02.2020