Google BigQuery python - 错误分页表

Posted

技术标签:

【中文标题】Google BigQuery python - 错误分页表【英文标题】:Google BigQuery python - error paginating table 【发布时间】:2017-06-27 09:40:00 【问题描述】:

我在 BigQuery 中有一个大表,我必须通过它来获取所有数据并在我的 GAE 应用程序中对其进行处理。由于我的表将有大约 4m 行,我决定我必须通过代码示例中实现的分页机制获取数据>https://cloud.google.com/bigquery/querying-data

def async_query(query):
    client = bigquery.Client()
    query_job = client.run_async_query(str(uuid.uuid4()), query)
    query_job.use_legacy_sql = False
    query_job.use_query_cache = False
    query_job.begin()

    wait_for_job(query_job)

    query_results = query_job.results()
    page_token = None
    output_rows = []

    while True:
        rows, total_rows, page_token = query_results.fetch_data(max_results = 200, page_token = page_token)
        output_rows = output_rows + rows
        if not page_token:
            break

def wait_for_job(job):
    while True:
        job.reload()  # Refreshes the state via a GET request.
        if job.state == 'DONE':
            if job.error_result:
                raise RuntimeError(job.errors)
            return
        time.sleep(1)

但是当我执行它时,我收到一个错误:

DeadlineExceededError: The overall deadline for responding to the HTTP request was exceeded.

当 max_results 参数 > 表大小时,它工作正常。当 max_results

【问题讨论】:

【参考方案1】:

该错误表明您的整体请求处理程序处理时间过长。很可能是由于分页导致的多次query_results.fetch_data 迭代。

您可能需要检查:

Dealing with DeadlineExceededErrors Deadline errors: 60 seconds or less in Google App Engine

您可能需要重新考虑您的应用程序,也许尝试不立即获得整个结果,而是:

只获取部分结果 在单独的请求中获取结果,稍后在后台获取结果后,例如: 通过单个任务队列请求(改为 10 分钟或 60 秒截止日期) 通过从单独的任务队列请求中收集的多个块组装它以真正使其可扩展(不确定这是否真的适用于 bigquery,我只在数据存储区尝试过)

【讨论】:

以上是关于Google BigQuery python - 错误分页表的主要内容,如果未能解决你的问题,请参考以下文章

使用 Pandas/Python 获取 Google BigQuery 数据的 JSON 格式

使用 Python 客户端的 Google BigQuery API

如何使用 google-api-python-client 设置 BigQuery 配置属性?

Python,AttributeError:模块'google.cloud.bigquery'在cx_Freeze构建后没有属性'Client'

Google BigQuery - python 客户端 - 创建/管理作业

Google BigQuery python - 错误分页表