【问题标题】:Google BigQuery python - error paginating tableGoogle BigQuery python - 错误分页表
【发布时间】: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

【问题讨论】:

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


    【解决方案1】:

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

    您可能需要检查:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-12
      • 1970-01-01
      • 1970-01-01
      • 2013-11-22
      相关资源
      最近更新 更多