Какова роль tbl () в запросе sparklyr? - PullRequest
0 голосов
/ 19 февраля 2020

Допустим, у меня есть запрос (строка символов), хранящийся в объекте R с именем my_query. Я хочу выполнить этот запрос в моем контексте Spark. Сначала я регистрирую несколько таблиц в контексте Spark.

my_table <- sparklyr::spark_read_orc(
  sc,
  name = "my_table",
  path = "wasbs://my_table",
  memory = FALSE
)

Теперь я выполняю свой запрос.

my_query %>%
  dplyr::sql() %>%
  dplyr::tbl(sc, .) %>%
  sparklyr::spark_write_orc(path = "result_path", mode = "overwrite")

Какова роль функции tbl() здесь? Функция tbl() переносит данные в память Spark? т.е. запрос все еще лениво оценивается? Это зависит от типа запроса? Например, я представляю, что простые операторы SELECT и WHERE не требуют ввода данных в память, но если вы создаете новые столбцы в некотором виде dplyr::mutate() (или эквивалентном SQL коде), это потребует принести это в память?

1 Ответ

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

Какова роль функции tbl() здесь

Это общий c метод, используемый для извлечения таблицы из внешнего источника.

Поскольку sparklyr ведет себя эффективно, как соединение с базой данных, он будет следовать стандартному пути dbplyr, вызывая dblyr::tbl_sql, основная обязанность которого состоит в том, чтобы подготовить структуру данных, представляющую (ленивый) источник данных, и решить схема, вызывая соответствующую реализацию db_query_fields.

Последняя часть в значительной степени является единственным компонентом Spark-Speci c, который на данный момент реализован , как показано ниже

#' @export
#' @importFrom dplyr db_query_fields
#' @importFrom dplyr sql_select
#' @importFrom dplyr sql_subquery
#' @keywords internal
db_query_fields.spark_connection <- function(con, sql, ...) {
  sqlFields <- sql_select(
    con,
    sql("*"),
    sql_subquery(con, sql),
    where = sql("0 = 1")
  )


  hive_context(con) %>%
    invoke("sql", as.character(sqlFields)) %>%
    invoke("schema") %>%
    invoke("fieldNames") %>%
    as.character()
}

Как видите, здесь мало что происходит, и здесь не о чем беспокоиться.

В любом случае невозможно дать один ответ. sparklyr Выбор дизайна: eageri sh (показывая пользователю частичный вывод), а также активное кэширование, используемое во всем пакете, может иметь неожиданные последствия.

Кроме того, Spark SQL не требует особых усилий, и различные типы операций сами по себе могут привести к частичной оценке.

Однако использование tbl здесь не ухудшает ваш код чем использовать my_table напрямую.

...