【问题标题】:PERCENT_RANK() in BigQuery returns Resources exceededBigQuery 中的 PERCENT_RANK() 返回超出资源
【发布时间】:2015-10-19 00:57:08
【问题描述】:

当我尝试在大型数据集上使用 PERCENT_RANK() 时,它给了我一个错误。

SELECT 
  a2_lngram, 
  a2_decade, 
  a2_totalfreq, 
  a2_totalbooks, 
  a2_freq, a2_bfreq, 
  a2_arf, 
  c_avgarf, 
  d_arf, 
  oi, 
  PERCENT_RANK() OVER (ORDER BY d_arf DESC) plarf 
FROM [trigram.trigrams8]

使用目标表和 AllowLargeResults 返回:

“查询执行期间资源超出。”

当我将结果限制为几百个时,它运行良好。

JobID: otichyproject1:job_PpTpmMXYETUMiM_2scGgc997JVg 数据集是公开的。

【问题讨论】:

  • 这里有什么问题?
  • 嗯,我明白这意味着什么,问题是,由于它在 Google Cloud 中运行,资源究竟是如何超出的以及如何提供帮助。我认为 Felipe 的回答正是如此。

标签: google-bigquery


【解决方案1】:

这是预期的:分析/窗口函数的输入需要适合一个节点才能成功运行。

PERCENT_RANK() OVER (ORDER BY d_arf DESC) plarf

仅当所有行都适合一个节点时才会运行。如果没有,您将看到“查询执行期间超出资源”错误。

有一种方法可以通过分析函数进行扩展:对数据进行分区。

PERCENT_RANK() OVER (PARTITION BY country ORDER BY d_arf DESC) plarf

...那么该函数可以在多个节点上运行,只要每个“国家”行适合一个 VM。

但不是你的情况 - 我在这里要做的修复是计算单独的子查询、连接和除法的总数。

总而言之,分析函数很酷,但它们在每个分区的大小上存在可伸缩性问题 - 幸运的是,还有其他方法可以获得相同的结果。

【讨论】:

  • 太好了,感谢您对解析函数的限制和建议的解决方案的解释!
  • Felipe,我刚刚意识到我再次需要同样的东西,但使用排名或行数,而不是百分比。我只看到如何使用分析函数,而不是通过 JOIN。有什么想法吗?
  • 分区不管,使用前一个分区的max()+这个分区的位置?
  • 很抱歉,没有得到这个,你能详细说明一下吗?谢谢!
  • 打开一个新问题,我会试一试(只要我能)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多