You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用已弃用的google-api-python-client设置BigQuery配置属性(含BATCH优先级)

如何在弃用的google-api-python-client中设置BigQuery查询为BATCH优先级

嘿,我之前也折腾过这个弃用的库来配置BigQuery批处理查询,虽然官方没给示例,但其实可以绕开库的限制,直接对接BigQuery Jobs API的原生参数来实现,给你分享一下具体做法:

核心思路

google-api-python-client本质是对BigQuery REST API的一层封装,所以我们可以手动在作业请求体里添加priority参数,直接使用API的原生配置项。

具体代码实现

假设你已经完成了认证(比如服务账号或OAuth2),拿到了可用的service对象,下面是完整的示例代码:

import time
from googleapiclient.discovery import build
from google.oauth2 import service_account

# 1. 初始化BigQuery服务(这里用服务账号认证,替换成你的认证方式即可)
credentials = service_account.Credentials.from_service_account_file(
    'path/to/your-service-account-key.json',
    scopes=['https://www.googleapis.com/auth/bigquery']
)
service = build('bigquery', 'v2', credentials=credentials)

# 2. 定义查询和作业配置
project_id = 'your-project-id'
query = 'SELECT * FROM `your-project-id.your-dataset.your-table` LIMIT 1000'

# 重点:在configuration.query里添加priority字段,设置为"BATCH"
job_body = {
    'configuration': {
        'query': {
            'query': query,
            'priority': 'BATCH',
            'useLegacySql': False  # 根据你的需求切换是否使用Legacy SQL
        }
    }
}

# 3. 提交批处理查询作业
job_response = service.jobs().insert(
    projectId=project_id,
    body=job_body
).execute()

# 4. 轮询作业状态(批处理不会立即执行,需要等待调度)
job_id = job_response['jobReference']['jobId']
print(f"已提交批处理作业,Job ID: {job_id}")

while True:
    job_status = service.jobs().get(
        projectId=project_id,
        jobId=job_id
    ).execute()
    
    job_state = job_status['status'].get('state')
    if job_state == 'DONE':
        if 'errorResult' in job_status['status']:
            print(f"作业失败:{job_status['status']['errorResult']['message']}")
        else:
            print("作业执行完成!")
            # 可选:获取查询结果
            results = service.jobs().getQueryResults(
                projectId=project_id,
                jobId=job_id
            ).execute()
            # 这里可以根据需要处理结果数据
            print(f"返回行数:{results.get('totalRows', 0)}")
        break
    else:
        print(f"作业当前状态:{job_state},等待中...")
        time.sleep(5)  # 每5秒查询一次状态

关键细节说明

  • 优先级参数:priority支持三个值:INTERACTIVE(默认,交互式查询)、BATCH(批处理,资源空闲时调度)、BATCH_EXCLUSIVE(独占批处理,优先级更低但资源隔离),根据你的需求选择即可。
  • 批处理特性:BATCH优先级的查询不会立即执行,BigQuery会在系统资源充足时排队调度,适合非紧急的大数据量查询,能节省成本。
  • 权限要求:确保你的认证账号拥有bigquery.jobs.create权限,以及查询目标数据集/表的读取权限。

额外提醒

虽然这个方法能解决当前问题,但还是建议尽快迁移到官方推荐的google-cloud-bigquery客户端库——毕竟google-api-python-client的BigQuery模块已经被弃用,后续不会再更新功能或修复bug。新库设置批处理优先级会更简洁,比如:

from google.cloud import bigquery

client = bigquery.Client()
job_config = bigquery.QueryJobConfig()
job_config.priority = bigquery.QueryPriority.BATCH

query_job = client.query(query, job_config=job_config)
query_job.result()  # 等待作业完成

内容的提问来源于stack exchange,提问作者Neil C. Obremski

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 08:11:34