你如何克服上述限制?
我试图使用LEAD和LAG窗口函数根据3条记录的序列查找流,然后计算其属性的一些聚合(计数,总和等)。
当我对一小部分数据运行我的查询时,一切都很好,组运行正常。但是当在更大的数据集上运行时,我得到:“在查询执行期间超出了资源。查询包含GROUP BY运算符,请考虑使用GROUP EACH BY。”
在许多其他情况下,切换到GROUP EACH BY做的工作...... 但是,当我使用窗口函数时,我无法使用EACH ......
有什么建议吗?最佳做法?
这是一个基于维基百科样本数据的示例查询。它显示了不同贡献者编辑标题的频率。 where条件只是为了限制响应大小,如果你删除“B”我们得到结果,如果我们添加它,我们得到“使用EACH”推荐。
select title,count (case when contributor_id<>LeadContributor then 1 else null end) as different,
count (case when contributor_id=LeadContributor then 1 else null end) as same,
count(*) as total
from
(
SELECT title,contributor_id,lead(contributor_id)over(partition by title order by timestamp) as LeadContributor
FROM [publicdata:samples.wikipedia]
where regexp_match(title,r'^[A,B]')=true)
group by title
由于
答案 0 :(得分:0)
我猜您的特定用例与示例查询不同,但让我评论一下我能够看到的内容:
让我们忘记GROUP和GROUP EACH。让我们看一下核心查询:
SELECT title, contributor_id, LEAD(contributor_id)
OVER(PARTITION BY title ORDER BY timestamp) AS LeadContributor
FROM [publicdata:samples.wikipedia]
WHERE REGEXP_MATCH(title, r'^[A,B]')
此查询失败,并且r&#39; ^ [A,B]&#39;并使用r&#39; ^ [A]&#39;,它突出显示OVER()限制:作为GROUP BY和ORDER BY,它仅适用于数据适合一台机器,因为它们不可并行化。作为r&#39; ^ [A]&#39;的答案揭示,这可能是很多数据 - 虽然有时不够。这就是为什么BigQuery提供可并行化的GROUP EACH BY的原因。但是,我们可以在这里使用OVER EACH BY。
(顺便说一句,我想说我喜欢样本查询......这是一个有趣的问题,有一个有趣的答案!)