如何使用dplyr和bigrquery从Big Query中的数据集中选择多个表?

时间:2016-04-28 16:58:01

标签: r dplyr google-bigquery

我尝试使用dplyr和bigrquery从Big Query中的数据集中查询多个表。数据集包含多个表,一个表用于一年中每天的数据。 我可以使用以下代码从单个表(例如,1天的数据)进行查询,但似乎不能使其同时跨多个表(例如,一个月或一年的数据)。任何帮助将不胜感激。

connection <- src_bigquery("my_project", "dataset1")
first_day <- connection %>%
    tbl("20150101") %>% 
    select(field1) %>%
    group_by(field1) %>%
    summarise(number = n()) %>%
    arrange(desc(number))

谢谢,

3 个答案:

答案 0 :(得分:1)

据我所知,table wildcard functions不支持 现在在dplyrbigrquery。如果你不害怕丑陋的黑客攻击,你可以提取并编辑dplyr构建并发送到bq的查询,使其指向多个表而不是一个表。

设置结算信息并连接到BigQuery:

my_billing <- ##########
bq_db <- src_bigquery(
  project = "bigquery-public-data",
  dataset = "noaa_gsod",
  billing = my_billing
)
gsod <- tbl(bq_db, "gsod1929")

如何从一张桌子中选择(仅供比较):

gsod %>%
  filter(stn == "030750") %>%
  select(year, mo, da, temp) %>%
  collect
Source: local data frame [92 x 4]

    year    mo    da  temp
   (chr) (chr) (chr) (dbl)
1   1929    10    01  45.2
2   1929    10    02  49.2
3   1929    10    03  48.2
4   1929    10    04  43.5
5   1929    10    05  42.0
6   1929    10    06  51.0
7   1929    10    07  48.0
8   1929    10    08  43.7
9   1929    10    09  45.1
10  1929    10    10  51.3
..   ...   ...   ...   ...

如何通过手动编辑dplyr

生成的查询来从多个表中进行选择
multi_query <- gsod %>%
  filter(stn == "030750") %>%
  select(year, mo, da, temp) %>%
  dplyr:::build_query(.)

multi_tables <- paste("[bigquery-public-data:noaa_gsod.gsod", c(1929, 1930), "]",
                      sep = "", collapse = ", ")

query_exec(
  query = gsub("\\[gsod1929\\]", multi_tables, multi_query$sql),
  project = my_billing
) %>% tbl_df
Source: local data frame [449 x 4]

    year    mo    da  temp
   (chr) (chr) (chr) (dbl)
1   1930    06    11  51.8
2   1930    05    20  46.8
3   1930    05    21  48.5
4   1930    07    04  56.0
5   1930    08    08  54.5
6   1930    06    06  52.0
7   1930    01    14  36.8
8   1930    01    27  32.9
9   1930    02    08  35.6
10  1930    02    11  38.5
..   ...   ...   ...   ...

验证结果:

table(.Last.value$year)
1929 1930 
  92  357 

答案 1 :(得分:1)

BigQuery标准SQL支持使用wildcard tables。修改问题中的示例,以下R代码选择数据集中的所有每日表。

library(dplyr)
library(bigrquery)
connection <- src_bigquery("my_project", "dataset1")
multi_days <- connection %>%
    tbl("*") %>% 
    select(field1) %>%
    group_by(field1) %>%
    summarise(number = n()) %>%
    arrange(desc(number))

以下是使用其中一个公开的BigQuery示例数据集的另一个示例。在这种情况下,只选择表的一个子集 - 1994年和2000年之间的那些。查询计算每个连续年份的平均温度。 (注意:您需要将billing的值更改为您自己的BigQuery项目ID才能运行查询):

library(dplyr)
library(bigrquery)
bq_src <- src_bigquery(
  project = "bigquery-public-data",
  dataset = "noaa_gsod",
  billing = "api-project-123456789"
)
results <- bq_src %>%
  tbl("gsod*") %>%
  filter(`_TABLE_SUFFIX` %>% between("1994", "2000")) %>% 
  group_by(year) %>% 
  summarise(temp = mean(temp, na.rm = TRUE)) %>% 
  arrange(year)
print(results)

答案 2 :(得分:0)

在'bigrquery'中使用'list_tabledata'命令怎么样? 我用与你相同的符号测试了这段代码,输出的工作目录中的.RData文件与日期范围内的天数一样多。

library(bigrquery)    
project<-"my_project"    
dataset<-"dataset1"    
day<-seq(from=as.Date("20150101",format="%Y%m%d"),to=as.Date("20150131",format="%Y%m%d"),by="days")    
for (i in seq_along(day))    
     {    
        t<-list_tabledata(project,dataset,gsub("-","",as.character(day[i])),max_pages=Inf)    
        save(t,file=paste(gsub("-","",as.character(day[i])),".RData"))    
     }    

希望它有效!
LourdesHernández