Как дать dplyr SQL-запрос и вернуть его удаленному объекту tbl? - PullRequest
1 голос
/ 26 марта 2019

Скажем, у меня открыт удаленный tbl с использованием dbplyr, и я хочу использовать SQL-запрос к нему (возможно, потому что нет перевода dbplyr для того, что я хочу сделать), как мне дать его так, чтобы он возвращал удаленный tblobject?

Функция 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()), но он возвращает удаленную таблицу?

Спасибо

Ответы [ 2 ]

1 голос
/ 26 марта 2019

Ну, играя с тем, как это работает, я думаю, что нашел способ.Вы можете задать sql-запрос внутри функции mutate:

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 без необходимости вычисления таблицы тоже.

0 голосов
/ 27 марта 2019

Насколько я понимаю, существует набор стандартных переводов, которые dbplyr делает из dplyr в SQL.Все, что выходит за рамки этого перевода, остается без изменений.

Например, DATEFROMPARTS - это функция SQL, но не функция R.Я обычно использую следующий метод mutate:

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

И поскольку не существует определенного перевода из функции R DATEFROMPARTS в функцию SQL (поскольку функция R не существует в dplyr), ее оставляют как есть..

...