将 BQ 查询结果下载到 Python 数据框时出现 504 Deadline Exceeded 错误

Posted

技术标签:

【中文标题】将 BQ 查询结果下载到 Python 数据框时出现 504 Deadline Exceeded 错误【英文标题】:504 Deadline Exceeded error when downloading BQ query results to Python dataframe 【发布时间】:2020-08-07 14:24:35 【问题描述】:

我正在使用 Python 对 BigQuery 数据集运行查询,然后将结果放入 Python 数据集。 查询运行正常;我可以看到在 BQ 中为数据集中的结果创建了一个临时表,但是在使用查询客户端的 to_dataset 方法时,它会因 504 Deadline Exceeded 错误而崩溃

client = bigquery.Client( credentials=credentials, project= projectID )
dataset = client.dataset('xxx')
table_ref =  dataset.table('xxx')
JobConfig = bigquery.QueryJobConfig(destination = table_ref) 
client.delete_table(table_ref, not_found_ok=True)
QueryJob = client.query(queryString, location='EU', job_config=JobConfig)
QueryJob.result()
results = client.list_rows(table_ref, timeout =100).to_dataframe()

直到最后一行都运行良好。我在 list_rows 方法中添加了一个超时参数,但它没有帮助。 我在安装了 Python 3.8 的 Windows 虚拟机上运行它。 (我还在我的笔记本电脑上测试了相同的代码,它工作得很好 - 不知道有什么不同。)

【问题讨论】:

【参考方案1】:

看看: https://github.com/googleapis/python-bigquery-storage/issues/4

这是 Windows 中的一个已知错误,“解决方案”是:

import google.cloud.bigquery_storage_v1.client
from functools import partialmethod

# Set a two hours timeout
google.cloud.bigquery_storage_v1.client.BigQueryReadClient.read_rows = partialmethod(google.cloud.bigquery_storage_v1.client.BigQueryReadClient.read_rows, timeout=3600*2) 

如果你会使用:

bqClient = bigquery.Client(credentials=credentials, project=project_id)
bq_storage_client = bigquery_storage_v1.BigQueryReadClient(credentials=credentials)
raw_training_data = bqClient.query(SOME_QUERY).to_arrow(bqstorage_client=bq_storage_client).to_pandas()

【讨论】:

到处寻找解决方案。这对我有用(我在 Windows 上)。【参考方案2】:

如果你可以使用 pandas,试试这个:

import pandas as pd
df = pd.read_gbq("select * from `xxx.xxx`", dialect='standard', use_bqstorage_api=True)

为了能够使用use_bqstorage_api,您必须在 GCP 上进行设置。在documentation中阅读更多相关信息

【讨论】:

谢谢,约瑟夫。安装所需模块并添加如下参数后:df = pd.read_gbq(queryString, project_id = myprojectID, credentials =my credentials, dialect='standard', location = 'EU', use_bqstorage_api=True, verbose=True) 我仍然收到超过 504 截止日期的错误。【参考方案3】:

这个链接对我有帮助:https://googleapis.dev/python/bigquery/latest/usage/pandas.html

我的工作代码是:

credentials, your_project_id = google.auth.default(scopes=["https://www.googleapis.com/auth/cloud-platform"])
bqclient = bigquery.Client(credentials=credentials, project=your_project_id)
query_string = """SELECT..."""
df = bqclient.query(query_string).to_dataframe()

希望对大家有所帮助

【讨论】:

以上是关于将 BQ 查询结果下载到 Python 数据框时出现 504 Deadline Exceeded 错误的主要内容,如果未能解决你的问题,请参考以下文章

具有目标表的bq查询的定价

将 BQ 查询的输出分配给变量

将json查询结果加载到数据框

尝试在 Shiny 应用程序中显示来自 SQL Server 查询的数据框时出现问题

使用 Airflow 将 Bigquery 查询结果发送到数据框

Python - 使用 sqlalchemy 的 Postgres 查询返回“空数据框”