如何使用 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
目前在dplyr
和bigrquery
中。如果您不害怕丑陋的黑客攻击,您可以提取和编辑 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 数据库后列出表的字段
如何使用 R 和 dplyr 从 Redshift 检索超过 100000 行