【问题标题】:How to select from multiple table within a dataset in Big Query using dplyr and bigrquery?如何使用 dplyr 和 bigquery 从 Bigquery 数据集中的多个表中进行选择?
【发布时间】:2016-04-28 16:58:00
【问题描述】:

我正在尝试使用 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))

谢谢你,

胡安

【问题讨论】:

    标签: r dplyr google-bigquery


    【解决方案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 
    

    【讨论】:

      【解决方案2】:

      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)
      

      【讨论】:

        【解决方案3】:

        在“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"))    
             }    
        

        希望它有效!
        卢尔德·埃尔南德斯

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-11-28
          • 1970-01-01
          • 2021-05-31
          • 1970-01-01
          相关资源
          最近更新 更多