等待在 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 脚本运行但不执行任何操作