Есть ли способ добавить таблицы в do.call () при использовании глаголов dplyr в базе данных? - PullRequest
0 голосов
/ 27 февраля 2020

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

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

Описание

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

1 Ответ

1 голос
/ 28 февраля 2020

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