dplyr / bigrquery способ запроса / связывания нескольких таблиц одной и той же схемы в BigQuery? - PullRequest
0 голосов
/ 20 сентября 2019

Используя методы, описанные в этом документе readme, можно просто запросить одну таблицу, например

library(bigrquery)
library(dplyr)

natality <- tbl(con, "natality")

natality %>%
  select(year, month, day, weight_pounds) %>% 
  head(10) %>%
  collect()

Это позволяет нам писать обычный dplyr код для natality и bigrquery преобразует этот код dplyr в запрос BigQuery.

Но предположим, что таблица natality была вместо 2 (или более) отдельных таблиц с именами natality1, natality2, и что они могли бы быть rbind 'вместе.

Как я могу сделать это с помощью BigQuery?То есть, как я могу запросить эти отдельные таблицы, как будто они все вместе как одна таблица?

То, что я пытался

Я думал, bind_rows может работать, но это не так.

library(bigrquery)
library(dplyr)

natality1 <- tbl(con, "natality1")
natality2 <- tbl(con, "natality2")

natality1 %>% bind_rows(., natality2) %>%
  select(year, month, day, weight_pounds) %>% 
  head(10) %>%
  collect()

Примечания

1 Ответ

1 голос
/ 20 сентября 2019

Мне не известно, что dbplyr имеет rbind функциональность.Возможно, потому что не каждый сервер базы данных поддерживает это?

Я решаю эту проблему в SQL Server с помощью пользовательской функции, которая записывает явный запрос UNION ALL (эквивалент SQL Server rbind).Ниже приведен пример функции для SQL ( ссылка на другие функции из этого подхода ).Возможно, этот пример может послужить вдохновением для эквивалентного подхода bigquery?

union_all = function(table_a,table_b){
  # extract the connection
  db_connection = table_a$src$con

  sql_query = build_sql(con = db_connection,
                      sql_render(table_a), # the SQL code that defines table A
                      "\nUNION ALL\n", # insert union all command between them
                      sql_render(table_b) # the SQL code that defines table B
  )

  return(tbl(db_connection, sql(sql_query)))
}

Идея состоит в том, что union_all() возвращает объект удаленной таблицы, определенный запросом с эквивалентной командой rbind.

...