有没有办法关闭rdplyrsql中的descripe

3duebb1j  于 2021-06-26  发布在  Impala
关注(0)|答案(2)|浏览(344)

我使用r和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'

所有的描述都在每次查询之前运行。(every collect())我有很多表,所有这些描述都在浪费大量的时间。尤其是在 Impala 上,有些描述可能需要一段时间才能完成。
有办法关掉这些吗?有什么我能做的吗?我看了看文件,什么也没找到:https://db.rstudio.com/dplyr/

kwvwclae

kwvwclae1#

也许是这样的?我无法复制您的问题,如果没有帮助,我很抱歉:

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)

一旦你做对了,就用一个定制的collect函数来 Package 它:

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

x7rlezfr2#

我的假设是,这是使用 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()

此链接似乎提供了有关如何创建impala连接字符串的说明。但考虑到你的设置,你可能有一个相同的方法。
如果你尝试了以上的方法,并且仍然观察 DESCRIBE TABLE 运行时,可能需要对表进行描述才能返回结果,正如@lukasz所建议的那样——而impala连接的本质是它无法判断需要哪些表。
你在开场白中还提到你正在使用r-shiny。闪亮应用程序的动态特性意味着代码的哪些部分运行并不总是直观的。因此,如果您没有单独测试上述内容,则有可能 DESCRIBE TABLE 正在被你闪亮应用程序的另一个部分调用,而你没有意识到它正在运行。

相关问题