等待在 Apps 脚本中插入 BigQuery?

Posted

技术标签:

【中文标题】等待在 Apps 脚本中插入 BigQuery?【英文标题】:Wait for insert in BigQuery in AppsScript? 【发布时间】:2020-04-07 17:38:21 【问题描述】:

我想等待 BigQuery 插入作业完成。在这个用例中,我正在对 Google Drive 中的 CSV 文件进行插入操作,这些文件可能非常大。

var res = BigQuery.Jobs.insert(job, projectId, data);

如果我有查询结果,我可以对 jobComplete 属性进行轮询,但在插入时没有。

例如,工作状态状态似乎永远不会是“正在运行”之外的任何东西。 因此,如何在此处等待或轮询插入以确保完成?

job = BigQuery.Jobs.insert(job, projectId, data);
var state = job.status.state;

// this never ends:
for( var sleep=128 ; state.equals('RUNNING') ; sleep*=2 ) 
  Logger.log(state);
  state = job.status.state;
  Utilities.sleep(sleep);
 // for 

【问题讨论】:

这是一个教程的摘录job = BigQuery.Jobs.insert(job, projectId, data); Logger.log('Load job started. Check on the status of it here: ' + 'https://bigquery.cloud.google.com/jobs/%s', projectId); 教程在这里找到https://developers.google.com/apps-script/advanced/bigquery 我希望能有所帮助。抱歉,我无法提供更多帮助...我从未使用过 BigQuery 投票工作状态:cloud.google.com/bigquery/docs/reference/rest/v2/Job#JobStatus @Cooper,insert() 方法异步调用插入然后返回。在那里创建的 URL 只是一个到控制台的用户级链接,但不提供任何类型的其他接口来进行自省。 我的印象是您可以轮询该 url 的状态。 @tehhowch 我刚刚更新了问题,但实际上 jobstatus.state 似乎从未改变,即使工作确实在后端完成。 【参考方案1】:

不确定您的插入是否与我的相同,但是,当我运行insert 语句时,我仍然使用BigQuery.Jobs.query() 命令。这让我仍然可以轮询 jobStatus 状态。

var sql = "Insert something ..etc";
try 
  var sqlJobResults = BigQuery.Jobs.query(request, projectId);
   catch(e) 
    Logger.log("Error while running SQL: %s\n Stack: %s",sql, e.stack);
    throw e;
  
  var jobId = sqlJobResults.jobReference.jobId;

  var sleepTimeMs = 500;
  var maxWaitMs = 60000;
  var waitedMs = 0;

  while (!sqlJobResults.jobComplete && waitedMs < maxWaitMs) 
    Utilities.sleep(sleepTimeMs);
    waitedMs += sleepTimeMs;
    sqlJobResults = BigQuery.Jobs.getQueryResults(projectId, jobId);
  

  if (waitedMs >= maxWaitMs) 
    Logger.log('SQL did not return within the time limit);
   

【讨论】:

以上是关于等待在 Apps 脚本中插入 BigQuery?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Google Apps 脚本将来自 Google 电子表格和 ScriptDB 的数据插入 BigQuery 表

如何通过 Google 表格中的二维数组通过 Apps 脚本插入 Big Query?

在 Apps 脚本中的自定义函数中,BigQuery 调用失败

用于自动化 Bigquery 的 Apps 脚本运行但不执行任何操作

在 Google Apps 脚本中使用 BigQuery 连接到 Google 电子表格

Google Apps 脚本:从 AuthConfig 到 Bigquery