我正在使用脚本来运行视图并使用查询结果来更新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中的问题
感谢您的帮助!
答案 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中。我认为它更强大,更易于维护,更易于使用和更具灵活性。