JOIN EACH和GROUP EACH BY子句不能用于窗口函数的输出

时间:2014-01-07 08:13:56

标签: google-bigquery

你如何克服上述限制?

我试图使用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

由于

1 个答案:

答案 0 :(得分:0)

我猜您的特定用例与示例查询不同,但让我评论一下我能够看到的内容:

  • 您找到了一种方法来使GROUP EACH和OVER成为可能:将OVER()查询与另一个查询相关联允许您将GROUP BY更改为GROUP EACH BY。但是,这个查询的问题不存在。
  • 让我们忘记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。

  • 我将在此处应用的解决方法正是您正在做的事情:仅使用一小部分数据执行OVER()。

(顺便说一句,我想说我喜欢样本查询......这是一个有趣的问题,有一个有趣的答案!)