我正在使用此逻辑来捕获BigQuery作业 是成功与否,但有时即使工作成功,我也是成功的工作 查询但没有插入行。
它主要发生在对表的查询中。
我使用了我在google文档中看到的代码,稍微为我添加了一些日志。
如果有人能告诉我自己做错了什么,那将会很棒。def _wait_for_response(self,bq_api,insert_response,max_wait_time = 3600): """获得bigQuery工作状态。等待DONE并检查错误。 如果存在错误 - 提出异常"""
start_time = time.time()
logstr.info(current_module='bq_session',
current_func='_wait_for_response')
# sleep interval between retries
# first, try 8 times every 1 second, then double sleep time until
# 30 seconds (and stay on 30 until max_wait_time is reached)
sleep = itertools.chain(itertools.repeat(1, 8), xrange(2, 30, 3),
itertools.repeat(30))
while time.time() - start_time < max_wait_time:
try:
job = bq_api.jobs().get(
projectId=insert_response['jobReference']['projectId'],
jobId=insert_response['jobReference']['jobId']).execute()
# on job end
if job['status']['state'] == 'DONE':
# if job failed raise error(s)
if 'errors' in job['status'].keys() and\
job['status']['errors']:
raise Exception(','.join(
[err['message']
for err in job['status']['errors']]))
else:
return job
except apiclient.errors.HttpError, error:
status = int(error.resp.get('status', 0))
if status >= 500:
pass
# raise Exception(
# global_messages.BQ_SERVER_ERROR.format(err=error))
elif status == 404:
raise Exception(
global_messages.BQ_JOB_NOT_FOUND.format(
jobid=insert_response['jobReference']['jobId']))
else:
raise Exception(
global_messages.BQ_ERROR_GETTING_JOB_STATUS.format(
err=error))
time.sleep(sleep.next())
raise Exception(global_messages.BQ_TIMEOUT.format(
time=max_wait_time,
jobid=insert_response['jobReference']['jobId']))
答案 0 :(得分:2)
如果状态大于500,脚本的这些行会导致控件失效。
if status >= 500:
pass
# raise Exception(
# global_messages.BQ_SERVER_ERROR.format(err=error))
这可能会阻止您看到预期的异常。