BigQuery - 在查询执行期间超出资源,并设置了允许大结果

时间:2017-05-02 15:05:00

标签: google-bigquery

我一直在尝试运行此查询,尽管将Allow Large results设置为true并设置了目标表,但我仍然不断获得资源超出错误。我也尝试添加限制。有什么方法可以优化查询以避免此错误?

SELECT
  repo_name,
  commit,
  parent,
  subject,
  message,
  difference.*
FROM
  FLATTEN(FLATTEN([bigquery-public-data:github_repos.commits], repo_name), parent)
WHERE
  (REGEXP_MATCH(message,r'(?i:null pointer dereference)'))
LIMIT
  5000000

非常感谢!

1 个答案:

答案 0 :(得分:2)

它对我有用(并花了大约一分半钟):

#standardSQL
SELECT
  repo_name,
  commit,
  parent,
  subject,
  message,
  difference
FROM
  `bigquery-public-data.github_repos.commits`
CROSS JOIN UNNEST(repo_name) AS repo_name
CROSS JOIN UNNEST(parent) AS parent
WHERE
  REGEXP_CONTAINS(message, r'(?i:null pointer dereference)');

我怀疑BigQuery中的遗留SQL在处理这类事情时更糟糕。顺便说一下:您是否有理由想要展平repo_nameparent数组?如果没有展平,查询将生成37,073行,而使用展平则生成11,419,166行。根据您要进行的分析类型,您可能根本不需要展平数据。

编辑:因为听起来扁平化只是为了解决遗留SQL与独立重复字段相关的限制,您可以删除CROSS JOIN并避免展平:

#standardSQL
SELECT
  repo_name,
  commit,
  parent,
  subject,
  message,
  difference
FROM
  `bigquery-public-data.github_repos.commits`
WHERE
  REGEXP_CONTAINS(message, r'(?i:null pointer dereference)');

这也更快 - 它需要大约15秒而不是90秒。