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内存?即查询是否仍在延迟评估?这取决于查询的类型吗?例如,我想象简单的 SELECT
和 WHERE
语句不需要将数据带入内存,但是如果您以某种形式创建新列 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
更糟糕。
假设我有一个查询(字符串)存储在名为 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内存?即查询是否仍在延迟评估?这取决于查询的类型吗?例如,我想象简单的 SELECT
和 WHERE
语句不需要将数据带入内存,但是如果您以某种形式创建新列 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
更糟糕。