如何使用已弃用的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
相关产品推荐
相关产品推荐

