使用分页时 BigQuery 找不到工作

Posted

技术标签:

【中文标题】使用分页时 BigQuery 找不到工作【英文标题】:BigQuery can't find job when using pagination 【发布时间】:2021-03-09 07:58:13 【问题描述】:

我一直在使用这个从here 获取的 AppScript 函数,稍作修改,它似乎工作正常,它只接受一个查询并返回一个二维数组。但是,如果查询很大并且返回的 totalRowsrows 多,因此需要分页,则作业似乎不会持久,因此在 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

【问题讨论】:

projectId 似乎没有定义。我猜它在其他地方,但你应该在你的问题中添加一个模拟声明。另外,您可以在 while 块之后删除所有代码吗?它不会为问题添加信息;) 做出这些改变!有没有可能知道问题出在哪里? 我无法提供太多帮助,因为我从未使用过 BigQuery。我会尝试查看https://bigquery.cloud.google.com/jobs/<project-id> 是否有结果以及它有多大。我还要仔细检查我使用的是版本 2 的高级服务。 这很奇怪——无论工作与否,工作都不会出现在控制台或命令行中!并且绝对使用最新版本:/ 我能想到的唯一原因是作业未显示在控制台或日志中是为作业配置的 projectId 与用于查看日志或控制台中的 projectId 不同.你能仔细检查一下吗? 【参考方案1】:

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

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

【讨论】:

【参考方案2】:

将位置选项传递给 getQueryResults 方法。

    queryResults = BigQuery.Jobs.getQueryResults(projectId, jobId, 
      pageToken: queryResults.pageToken,
      location: 'YourBigQueryLocation'
    );

它对我有用。

【讨论】:

以上是关于使用分页时 BigQuery 找不到工作的主要内容,如果未能解决你的问题,请参考以下文章

查询操作中的 BigQuery 错误:找不到项目 ID

如何解决 BigQuery 中的“在美国位置找不到数据集”错误?

奇怪的问题:找不到 Bigquery 数据集

加载操作中的 BigQuery 错误:找不到 URI

Google BigQuery:将查询结果保存到表时找不到数据集

BigQuery 创建表错误:在位置找不到数据集