【问题标题】:What is the role of tbl() in a sparklyr query?tbl() 在 sparklyr 查询中的作用是什么?
【发布时间】:2020-06-03 11:27:22
【问题描述】:

假设我有一个查询(字符串)存储在名为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 代码)创建新列,则需要带到记忆中了吗?

【问题讨论】:

    标签: r apache-spark tidyverse sparklyr


    【解决方案1】:

    tbl()函数在这里的作用究竟是什么

    它是用于从外部源获取表的通用方法。

    由于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 并不是严格意义上的 Eager,不同类型的操作本身可能会导致部分评估。

    但是在这里使用tbl 并不比直接使用my_table 更糟糕。

    【讨论】:

    • 非常感谢。这很有意义。
    猜你喜欢
    • 2018-10-26
    • 2021-09-30
    • 2018-01-14
    • 1970-01-01
    • 2012-02-24
    • 1970-01-01
    • 2020-09-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多