【问题标题】:JOIN EACH and GROUP EACH BY clauses can't be used on the output of window functionsJOIN EACH 和 GROUP EACH BY 子句不能用于窗口函数的输出
【发布时间】:2014-01-24 20:26:09
【问题描述】:

你将如何克服上述限制?

我正在尝试使用 LEAD 和 LAG 窗口函数根据 3 条记录的序列查找流,然后计算它们的属性的一些聚合(计数、总和等)。

当我对一小部分数据运行查询时,一切都很好,并且 group by 运行正常。但是在更大的数据集上运行时,我得到:“查询执行期间资源超出。查询包含 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

谢谢

【问题讨论】:

  • 你能提供一个示例数据集吗?示例查询?
  • 你能提供你的用户吗?我将授予您对我的生产环境的读取权限并分享我有问题的查询。
  • 您好 user2881671;我更愿意先用可公开讨论的查询和/或数据来试一试。对于 24x7 的一对一支持,Google 提供高级支持包,而 StackOverflow 则努力成为一个基于社区的渠道。如果您愿意分享更多信息,有很多人可以帮助并从这个问题中学习。
  • 添加了一个基于 wikipedia public 的示例查询

标签: google-bigquery


【解决方案1】:

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

  • 您找到了一种使 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'^[A,B]' 而失败,并与 r'^[A]' 一起使用,并且它突出显示了 OVER() 限制:作为 GROUP BY 和 ORDER BY,它仅在以下情况下才有效数据适合一台机器,因为它们不可并行化。正如 r'^[A]' 的答案所揭示的,这可能是很多数据——尽管有时还不够。这就是 BigQuery 提供可并行化的 GROUP EACH BY 的原因。但是,这里没有可并行化的 OVER EACH BY。

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

(顺便说一句,我喜欢这个示例查询……这是一个有趣的问题,有一个有趣的答案!)

【讨论】:

  • 如您所料,我的特殊情况有所不同。不幸的是,分块查询对我来说太复杂了......我重写了我的查询,没有窗口函数,但是有一些繁重的连接和聚合(Min,Max)......代码并不像我希望的那样优雅,但它工作:)
猜你喜欢
  • 2016-09-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多