我一直在尝试运行此查询,尽管将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
非常感谢!
答案 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_name
和parent
数组?如果没有展平,查询将生成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秒。