空格导致python的bigquery出现问题

vs3odd8k  于 2021-08-09  发布在  Java
关注(0)|答案(2)|浏览(312)

我有以下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%'
                """

更新:
这是一个缓存问题,因为在激活成本控制之前运行了有效的查询。这样,即使启用了成本控制,它也可以从缓存中检索数据。查询必须完全相同才能共享缓存,因此即使添加了空格也可以防止这种情况。

pcrecxhr

pcrecxhr1#

您可能启用了成本控制:文档
此错误意味着您的查询将要扫描的字节数超过“最大计费字节数”中设置的限制。
你能可靠地再现这个错误吗?看起来查询中的空白与bigqueryrols中的cost cont没有任何关系。。也许只是一个巧合,无论是数据更大,还是成本控制的引入。
编辑:alexandre的回答是对的——“好的查询”成功是因为它从缓存中获取结果。只是用重试(注意使用\u query\u缓存,而不是上面评论线程中的usequerycache)

safe_config = bigquery.QueryJobConfig(maximum_bytes_billed=10**10, use_query_cache=False)

对于正确的查询也得到了同样的错误。此外,还可以检查结果作业中的缓存命中,以查看是否从缓存中获取了响应。只要查询成功,它就等于true:

print("Cache hit: ")
print(answers_query_job.cache_hit)
yi0zb3m4

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文件来运行以下代码。
第一个代码,

from google.cloud import bigquery
import pandas

client = bigquery.Client()
dataset_ref = client.dataset("stackoverflow", project="bigquery-public-data")
dataset = client.get_dataset(dataset_ref)

job_config = bigquery.QueryJobConfig(maximum_bytes_billed=10**10)
job_config.use_query_cache = False

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%'
                """
answers_query_job = client.query(working_query, job_config) 
answers_query_job.to_dataframe()

第二个代码,

from google.cloud import bigquery
import pandas

client = bigquery.Client()
dataset_ref = client.dataset("stackoverflow", project="bigquery-public-data")
dataset = client.get_dataset(dataset_ref)

job_config = bigquery.QueryJobConfig(maximum_bytes_billed=10**10)
job_config.use_query_cache = False

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%'
                """

answers_query_job = client.query(working_query, job_config) 
answers_query_job.to_dataframe()

以上代码都不起作用。结果是错误:

Query exceeded limit for bytes billed: 10000000000. 24460132352 or higher required.

另一方面,如果 job_config = bigquery.QueryJobConfig(maximum_bytes_billed=25000000000) 已设置。两个查询都正常运行。

相关问题