我尝试使用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))
谢谢,
涓
答案 0 :(得分: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
答案 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