tbl() 在 sparklyr 查询中的作用是什么?

What is the role of tbl() in a sparklyr query?

假设我有一个查询(字符串)存储在名为 my_query 的 R 对象中。我想在我的 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内存?即查询是否仍在延迟评估?这取决于查询的类型吗?例如,我想象简单的 SELECTWHERE 语句不需要将数据带入内存,但是如果您以某种形式创建新列 dplyr::mutate() (或等效的 SQL 代码),需要将其存入内存吗?

What exactly is the role of the tbl() function here

这是用于从外部源获取 table 的通用方法。

由于 sparklyr 的行为类似于数据库连接,它将遵循标准的 dbplyr 路径,通过调用 dblyr::tbl_sql,其主要职责是准备表示(惰性)的数据结构数据源,并通过调用相应的 db_query_fields 实现解析架构。

最后一部分几乎是唯一的 Spark 特定组件,目前已实现 as show below

#' @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 急切的设计选择(通过向用户显示部分输出)以及整个包中使用的急切缓存,可能会产生意想不到的影响。

此外,Spark SQL 并非严格急切,不同类型的操作本身可能会导致部分评估。

然而,在这里使用 tbl 并不会使您的代码比直接使用 my_table 更糟糕。