首页 > 解决方案 > 使用分页时 BigQuery 找不到工作

问题描述

我一直在使用从这里获取的 AppScript 函数,稍作修改,它似乎工作正常,它只接受一个查询并返回一个 2D 数组。但是,如果查询很大并且返回的内容totalRows超过rows并且因此需要分页,则该作业似乎不会持久,因此我在之后收到以下错误while (queryResults.pageToken)

API call to bigquery.jobs.getQueryResults failed with error: Not found: Job cellular-nuance-292711:job_-i4Dk9W7JVKF2-W_5

该作业似乎从未出现在作业历史记录中或使用 bq 命令行工具。本质上,它会在第一次调用时返回数据,但不可能多次查询同一个作业,因为它会消失。

这是我的功能:

function runQuery(query) {
  var request = {
    query: query,
    useLegacySql: false
  };
  var queryResults = BigQuery.Jobs.query(request, bigQuerySettings.projectId);
  var jobId = queryResults.jobReference.jobId;
  var projectId = bigQuerySettings.projectId; // This is just a mock declaration, it's actually declared elsewhere in the actual code

  // Check on status of the Query Job.
  var sleepTimeMs = 500;
  while (!queryResults.jobComplete) {
    Utilities.sleep(sleepTimeMs);
    sleepTimeMs *= 2;
    queryResults = BigQuery.Jobs.getQueryResults(projectId, jobId);
  }

  // Get all the rows of results.
  var rows = queryResults.rows;
  while (queryResults.pageToken) {
    queryResults = BigQuery.Jobs.getQueryResults(projectId, jobId, {
      pageToken: queryResults.pageToken
    });
    rows = rows.concat(queryResults.rows);
  }
}

我一直在添加大量日志,并且可以确认该作业在第一次尝试后肯定会正确返回,并且行中甚至还有数据 - 问题只是当有一个分页标记时,因为totalRows大于rows.

标签: javascriptgoogle-apps-scriptgoogle-bigquery

解决方案


原来我只需要在最后一部分添加位置:

while (queryResults.pageToken) {
    queryResults = BigQuery.Jobs.getQueryResults(projectId, jobId, {
      pageToken: queryResults.pageToken,
      location: bigQuerySettings.location
    });
    rows = rows.concat(queryResults.rows);
}

推荐阅读