我有以下python代码来检索bigquery数据集。然后我在kaggle上的jupyter笔记本上执行两个查询working\u query和bad\u query。唯一的区别是在后面的第3行添加了空格 ...posts_questions
as q这会导致错误的查询失败并返回消息
Query exceeded limit for bytes billed: 10000000000. 24460132352 or higher required.` 我知道已经启用了成本控制,但不知道这是怎么回事。我怎样才能在将来避免这样的陷阱,有人能解释这个问题吗?
from google.cloud import bigquery
client = bigquery.Client()
dataset_ref = client.dataset("stackoverflow", project="bigquery-public-data")
dataset = client.get_dataset(dataset_ref)
safe_config = bigquery.QueryJobConfig(maximum_bytes_billed=10**10)
answers_query_job = client.query(working_query, job_config=safe_config)
answers_query_job.to_dataframe()
working_query = """
SELECT a.id, a.body, a.owner_user_id
FROM `bigquery-public-data.stackoverflow.posts_answers` AS a
INNER JOIN `bigquery-public-data.stackoverflow.posts_questions` AS q
ON q.id = a.parent_id
WHERE q.tags LIKE '%bigquery%'
"""
bad_query = """
SELECT a.id, a.body, a.owner_user_id
FROM `bigquery-public-data.stackoverflow.posts_answers` AS a
INNER JOIN `bigquery-public-data.stackoverflow.posts_questions` AS q
ON q.id = a.parent_id
WHERE q.tags LIKE '%bigquery%'
"""
更新:
这是一个缓存问题,因为在激活成本控制之前运行了有效的查询。这样,即使启用了成本控制,它也可以从缓存中检索数据。查询必须完全相同才能共享缓存,因此即使添加了空格也可以防止这种情况。
2条答案
按热度按时间pcrecxhr1#
您可能启用了成本控制:文档
此错误意味着您的查询将要扫描的字节数超过“最大计费字节数”中设置的限制。
你能可靠地再现这个错误吗?看起来查询中的空白与bigqueryrols中的cost cont没有任何关系。。也许只是一个巧合,无论是数据更大,还是成本控制的引入。
编辑:alexandre的回答是对的——“好的查询”成功是因为它从缓存中获取结果。只是用重试(注意使用\u query\u缓存,而不是上面评论线程中的usequerycache)
对于正确的查询也得到了同样的错误。此外,还可以检查结果作业中的缓存命中,以查看是否从缓存中获取了响应。只要查询成功,它就等于true:
yi0zb3m42#
我已经使用您的两个查询执行了一些测试,它们的执行方式是相同的。
首先,我必须指出query()方法接收一个字符串,并使用job\ u config配置作业。此外,文档没有提到任何与查询字符串中的额外空格相关的问题。
此外,如果您导航到bigqueryui,一次复制并粘贴一个查询并执行它,您将看到,在job information下,两个查询将处理大约23gb的数据,并且相同数量的数据将是计费的字节。因此,如果你
bigquery.QueryJobConfig(maximum_bytes_billed=23000000000)
省略to_dataframe()
方法,则上述两个查询都将完美运行。更新:
根据文档,默认情况下
use_query_cache
设置为true,这意味着如果运行同一个查询,它将从上一个查询检索结果。因此,不会处理任何字节。如果以前运行查询时没有maximum_bytes_billed
设置。然后以最大数量运行同一个查询,即使处理的数量比您现在设置的多,查询也会运行。在您的例子中,我使用了来自ai平台的python3笔记本和shell中的.py文件来运行以下代码。
第一个代码,
第二个代码,
以上代码都不起作用。结果是错误:
另一方面,如果
job_config = bigquery.QueryJobConfig(maximum_bytes_billed=25000000000)
已设置。两个查询都正常运行。