如何使用 dplyr 和 bigquery 从 Bigquery 数据集中的多个表中进行选择?

Posted

技术标签:

【中文标题】如何使用 dplyr 和 bigquery 从 Bigquery 数据集中的多个表中进行选择?【英文标题】:How to select from multiple table within a dataset in Big Query using dplyr and bigrquery? 【发布时间】: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))

谢谢你,

胡安

【问题讨论】:

【参考方案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"))    
         

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

【讨论】:

以上是关于如何使用 dplyr 和 bigquery 从 Bigquery 数据集中的多个表中进行选择?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 R 中使用 DBI 连接到 bigquery 数据库后列出表的字段

如何从 dplyr 中的 case_when 捕获逻辑

如何使用 R 和 dplyr 从 Redshift 检索超过 100000 行

如何从 Bigquery 中的某个单元格中减去?

max(.) 中的错误:使用 dplyr dbplyr 和 bigrquery 时参数的“类型”(列表)无效

如何通过使用 dplyr 或其他包在 R 中具有最小值和最大值的查询来实现组?