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

Используя методы, описанные в этом файле 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()

Примечания


person stevec    schedule 20.09.2019    source источник


Ответы (1)


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

Я решаю эту проблему в SQL Server с помощью пользовательской функции, которая записывает явный запрос UNION ALL (эквивалент rbind в SQL Server). Ниже приведен пример функции для 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 внутри него.

person Simon.S.A.    schedule 20.09.2019
comment
Оказывается, я «делал это неправильно». Вместо того, чтобы перемещать несколько частей одной таблицы в BigQuery, я должен был сначала объединить их (находясь в хранилище) — и только потом переместить одну таблицу в BigQuery. Я очень ценю вашу помощь (ваше решение - очень творческий обходной путь) - person stevec; 22.09.2019
comment
Рад слышать, что вы нашли решение. Возможно, вы могли бы опубликовать это как правильный ответ? - person Simon.S.A.; 22.09.2019