【问题标题】:Is there a way to turn off DESCRIBE in R dplyr sql有没有办法在 R dplyr sql 中关闭 DESCRIBE
【发布时间】:2026-01-30 04:25:02
【问题描述】:

我正在使用 R shiny 和 dplyr 连接到数据库并在 Impala 中查询数据。我执行以下操作。

con <- dbPool(odbc(),
Driver = [DIVER],
Host = [HOST],
Schema = [SCHEMA],
Port = [PORT],
UID = [USERNAME],
PWD = [PASSWORD])

table_foo <- tbl(con, [TABLE_NAME_FOO])
table_bar <- tbl(con, [TABLE_NAME_BAR])

例如,当我运行查询时:

table %>% filter(name=greg) %>% collect()

有一些描述正在 impala 上运行:

DESCRIBE TABLE 'table_foo'
DESCRIBE TABLE 'table_bar'

所有描述在每个查询之前运行。(每个收集()) 我有很多表,所有这些描述都在浪费大量时间。 特别是在 impala 上,一些描述可能需要一段时间才能运行。

有没有办法关闭这些?有什么我可以做的吗? 我查看了文档,找不到任何东西: https://db.rstudio.com/dplyr/

【问题讨论】:

  • R/dplyr 使用describe table 获取有关结果集的元数据,因此它是查询表的重要组成部分。
  • 我的意思是这里的问题是它有点荒谬:1)它实际上运行它不会查询的表的描述。 2) 甚至运行描述我何时使用 dbGetQuery 而不是使用 dplyr。我不知道有任何其他 orm 将其作为默认配置吗?
  • 更多信息会有所帮助。请您将table %&gt;% filter(name=greg) %&gt;% explain() 的结果添加到您的问题中吗?谢谢。

标签: sql r dplyr impala


【解决方案1】:

也许是这样的?如果没有帮助,我无法重现您的问题,非常抱歉:

lazy_tbl <- table %>% filter(name=greg)
sql_query <- dbplyr::sql_render(lazy_tbl) %>% gsub("\\n"," ", .)
# print sql_query and see if there are DESCRIBE statements to get out
output <- DBI::dbGetQuery(con, sql_query)

然后,一旦你做对了,就把它包装在一个自定义收集函数中:

collect2 <- function(x){
  dbplyr::sql_render(x) %>% 
    gsub("\\n"," ", .) %>%
    # other steps ?
    DBI::dbGetQuery(x$src$con, .)
}

【讨论】:

    【解决方案2】:

    我的假设是,这是使用 pool 包及其管理与数据库的多个连接的方式的结果。但是,您的问题没有提供足够的细节让我确定,而且我无法在我的本地环境中重现您的情况。

    如果问题是由pool 包引起的,我的建议是直接切换到使用dbplyr 包。这会将dplyr 命令翻译成数据库语言。

    # packages
    library(DBI)
    library(dplyr)
    library(dbplyr)
    
    # Connection string (see note below)
    connection_string = "DRIVER = ...; DATABASE = ...; HOST = ..."
    # connection
    con = dbConnect(odbc::odbc(), .connection_string = connection_string)
    
    # connect to two tables
    table_foo <- tbl(con, "TABLE_NAME_FOO")
    table_bar <- tbl(con, "TABLE_NAME_BAR")
    
    # review queries
    table_foo %>% explain()
    table_foo %>% filter(name=greg) %>% explain()
    # fetch data
    table_foo %>% filter(name=greg) %>% collect()
    

    This 链接似乎提供了有关如何创建 Impala 连接字符串的说明。但是根据您的设置,您可能有等效的方法。

    如果您尝试上述方法,但仍然观察到DESCRIBE TABLE 正在运行,那么可能是如@Lukasz 所建议的那样,返回结果需要描述表 - 而 Impala 连接的本质是它无法分辨哪些表需要。

    您还在开场白中提到您正在使用 R Shiny。闪亮应用程序的动态特性意味着运行代码的哪些部分并不总是直观的。因此,如果您没有单独测试上述内容,则有可能DESCRIBE TABLE 正在被您没有意识到正在运行的闪亮应用程序的不同部分调用。

    【讨论】:

      最近更新 更多