编程Google Apps脚本,以在BigQuery“查询执行期间超出资源”时抛出错误

时间:2019-05-31 20:06:46

标签: sql google-apps-script google-bigquery

我正在使用脚本来运行视图并使用查询结果来更新BigQuery中的表。然后,我在Data Studio中将这些表用于表/可视化。

我注意到的一个问题是,有时我的视图有时会突然引发错误“查询执行期间超出了资源”。我的Google Apps脚本将成功运行,但是该表将保持不变,因为无法执行该视图。结果,我的Data Studio可视化文件和表中的数据将过时。除非我去编辑视图并看到它引发了错误,否则我将无从得知。

有什么方法可以向我的脚本中添加一些内容,以便当Bigquery抛出“查询执行期间超出资源”错误时,脚本将失败或通知我?这样,由于错误,我将不会不知不觉地拥有过时的数据。

  var configuration = {
    "query": {
    "useQueryCache": false,
    "destinationTable": {
          "projectId": "abc-123",
          "datasetId": "report_tables",
          "tableId": "dashboard_1"
        },
    "writeDisposition": "WRITE_TRUNCATE",
    "createDisposition": "CREATE_IF_NEEDED",
    "allowLargeResults": true,
    "useLegacySql": false,
    "query": "SELECT * FROM `abc-123.report_tables.dashboard_1_view`"
    }
  };

  var job = {
    "configuration": configuration
  };

  var jobResult = BigQuery.Jobs.insert(job, "abc-123");
  Logger.log(jobResult);
}

我希望您能帮助我在上面的脚本中添加一些子句,以便在BigQuery视图中超出资源时,这将无法执行或以某种方式通知我,因此我知道可以更正BigQuery中的问题

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

您的函数成功了,因为BigQuery上的所有作业/查询都是异步的。 var jobResult = BigQuery.Jobs.insert(job, "abc-123");行仅提交作业/查询到BigQuery服务以开始执行。然后您的函数返回。

因此,您需要等待作业的status进行轮询,然后再执行以下操作以处理任何错误:

  [..]
  var job = BigQuery.Jobs.insert(job, "abc-123");
  Logger.log(job.status.state);
  var jobId = job.jobReference.jobId;

  // Check on status of the Query Job.
  var sleepTimeMs = 500;
  while (job.status.state !== "DONE") {
    Utilities.sleep(sleepTimeMs);
    job = BigQuery.Jobs.get("abc-123", jobId);
    Logger.log(job.status.state);
  }
  if(job.status.state === "FAILED"){
    //handle the errors
    Logger.log("FAILED");
  }else{
    Logger.log("FINISHED");
  }
 [..]

需要考虑的是,使用Google Apps脚本将所有这些都与您的个人Google帐户(即不是服务帐户)相关联。对您来说可能没关系,但是在企业中,这是不可以的。

最后,我可能会将您的脚本移动到Cloud Build中。我认为它更强大,更易于维护,更易于使用和更具灵活性。