Google BigQuery python - 错误分页表

时间:2017-06-27 09:40:01

标签: python google-app-engine pagination google-bigquery

我在BigQuery中有一个大表,我必须经历,获取所有数据并在我的GAE应用程序中处理它。由于我的表将是大约4米行,我决定我必须通过在此处的代码示例中实现的分页机制获取数据> 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 个答案:

答案 0 :(得分:0)

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

您可能需要查看:

您可能需要重新考虑一下您的应用,或者尝试不立即获得整个结果,而是:

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