dplyr / bigrquery在BigQuery中查询/绑定同一模式的多个表的方法吗?

时间:2019-09-20 02:38:12

标签: r dplyr google-bigquery dbplyr

使用this自述文档中概述的方法,可以直接查询单个表,就像这样

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个(或更多)单独的表,分别名为natality1natality2,并且可以将它们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 个答案:

答案 0 :(得分:1)

我不知道dbplyr具有rbind功能。也许是因为并非每个数据库后端都支持它?

我在SQL Server中解决此问题的方法是使用一个自定义函数,该函数编写一个显式的UNION ALL查询(SQL Server等效于rbind)。以下是SQL(link to other functions from this approach)的示例函数。也许这个例子可以启发等效的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命令。