【问题标题】:How to give dplyr a SQL query and have it return a remote tbl object?如何给 dplyr 一个 SQL 查询并让它返回一个远程 tbl 对象?
【发布时间】:2019-08-16 07:10:07
【问题描述】:

假设我有一个使用 dbplyr 打开的远程 tbl,并且我想对其使用 SQL 查询(可能是因为我想要做的事情没有 dbplyr 翻译),我该如何给它以使其返回一个远程 tbl对象?

DBI::dbGetQuery() 函数允许您向 db 发出查询,但它返回内存上的数据帧,而不是远程 tbl 对象。

例如,假设您已经有一个连接con 到一个数据库,您可以创建一个这样的表:

library(tidyverse)

x_df <- expand.grid(A = c('a','b','c'), B = c('d','e','f', 'g','h')) %>% 
  mutate(C = round(rnorm(15), 2))

DBI::dbWriteTable(conn = con,
                  name = "x_tbl",
                  value = x_df,
                  overwrite = TRUE)

x_tbl = tbl(con, 'x_tbl')

sql_query <- build_sql('SELECT a, b, c, avg(c) OVER (PARTITION BY a) AS mean_c FROM x_tbl')

y_df <- DBI::dbGetQuery(con, sql_query) # This returns a data frame on memory

y_tbl <- x_tbl %>% 
  group_by(a) %>% 
  mutate(mean_c = mean(c))

show_query(y_tbl) # This is a remote tbl object

在这种情况下,我可以使用y_tbl。但是也有函数在dbplyr上没有翻译的情况(比如分位数不起作用),我需要使用SQL代码。但我不想收集结果,我希望它创建一个远程 tbl 对象。有没有办法我可以给出一个 SQL 查询(比如 dbGetQuery())但让它返回一个远程 tbl?

谢谢

【问题讨论】:

    标签: sql r dplyr tidyverse dbplyr


    【解决方案1】:

    好吧,玩弄它的工作原理,我想我找到了一种方法。您可以在 mutate 函数中给出一个 sql 查询:

    y_tbl <- x_tbl %>% 
      group_by(a) %>% 
      mutate(mean_c = sql("avg(c) OVER (PARTITION BY a)"))
    
    show_query(y_tbl) # This is a remote tbl object
    

    这将使您无需计算表即可给出变量的 SQL 定义。

    【讨论】:

      【解决方案2】:

      据我了解,dbplyr 提供了一组从 dplyr 到 SQL 的标准翻译。超出此翻译范围的任何内容都将保持原样。

      例如,DATEFROMPARTS 是 SQL 函数,但不是 R 函数。我通常使用以下变异:

      y_tbl <- x_tbl %>% 
          mutate(new_date = DATEFROMPARTS(year_col, month_col, day_col)
      

      并且由于没有定义从 R 函数 DATEFROMPARTS 到 SQL 函数的转换(因为 R 函数在 dplyr 中不存在),所以它保持原样。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-10-30
        • 2014-11-03
        • 2021-05-20
        • 1970-01-01
        • 2021-02-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多