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

Posted

技术标签:

【中文标题】Google BigQuery - python 客户端 - 创建/管理作业【英文标题】:Google BigQuery - python client - creating/managing jobs 【发布时间】:2017-10-24 10:21:03 【问题描述】:

我是 BigQuery 世界的新手...我正在使用 python google.cloud 包,我只需在 BigQuery 表上运行 Python 查询并打印结果。这是创建查询作业的查询函数的一部分。

function test():
    query = "SELECT *  FROM " + dataset_name + '.' + table_name
    job = bigquery_client.run_async_query('test-job', query)
    job.begin()
    retry_count = 100
    while retry_count > 0 and job.state != 'DONE':
        retry_count -= 1
        sleep(10)
        job.reload()  # API call
    print(job.state)
    print(job.ended)

如果我多次运行 test() 函数,我会得到错误:

    google.api.core.exceptions.Conflict: 409 POST https://www.googleapis.com/bigquery/v2/projects/myprocject/jobs:
    Already Exists: Job myprocject:test-job

由于我必须多次运行 test() 函数,我是否必须每次都删除名为“test-job”的作业,还是必须分配一个新的作业名称(例如随机名称或日期时间-基于)每次?

【问题讨论】:

【参考方案1】:

我是否必须每次都删除名为“test-job”的作业

您无法删除作业。作业集合存储您项目的完整作业历史记录,但仅保证过去六个月内创建的作业的可用性。您可以做的最好的事情是请求自动删除超过 50 天的作业,您应该联系支持人员。

或者我是否必须每次都分配一个新的工作名称(例如一个随机的或基于日期时间的)?

是的。这是要走的路

【讨论】:

【参考方案2】:

作为附带建议,我们通常这样做:

import uuid
job_name = str(uuid.uuid4())

job = bigquery_client.run_async_query(job_name, query)

请注意,如果您运行同步查询,这已经是自动的。

此外,您不必管理作业完整性的验证(从版本 0.27.0 开始),如果您愿意,可以像这样使用它:

job = bigquery_client.run_async_query(job_name, query)
job_result = job.result()
query_result = job_result.query_results()
data = list(query_result.fetch_data())

【讨论】:

以上是关于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 - 错误分页表