BigQuery作业状态逻辑

时间:2014-10-14 16:00:08

标签: google-bigquery

我正在使用此逻辑来捕获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']))

1 个答案:

答案 0 :(得分:2)

如果状态大于500,脚本的这些行会导致控件失效。

if status >= 500:
    pass
    # raise Exception(
    #     global_messages.BQ_SERVER_ERROR.format(err=error))

这可能会阻止您看到预期的异常。