当getJobComplete()返回false时,试图弄清楚要做什么。我认为这意味着工作失败所以我应该继续并重新提交,但需要确认而不是假设!
谢谢
答案 0 :(得分:2)
只要getJobComplete()
返回false
,这意味着作业仍在执行。既没有失败也没有成功。只要作业没有完成,您必须每隔几秒钟向jobs.list
发出另一个电话。
getJobComplete()
返回true
后,作业结束,但您必须检查是否成功。为此,请检查getStatus().getErrorResult()
是否返回null
。如果它没有返回null
,这意味着工作没有成功。
答案 1 :(得分:1)
api pair jobs.query / jobs.getQueryResults实际上是jobs.insert / jobs.get / tabledata.list的包装。
在这两种情况下,您都会启动查询作业,等待它完成,然后从查询的输出表中读取结果。查询(和所有作业)运行异步并且可能需要时间,因此您需要在轮询循环中等待它们完成。
jobs.query / jobs.getQueryResults为您提供的是:(1)服务器端等待稍快检查作业完成,以及(2)在作业完成时返回查询结果的第一页。
jobs.insert / jobs.get / tabledata.list为您提供:(1)与所有类型的作业交互的一致方式,以及(2)区分api请求中的错误和错误的能力你的查询工作。如果要重试由于临时5xx错误而失败的api调用,使用jobs.get执行此操作是安全的。但是在调用jobs.getQueryResults时需要注意,因为作业中的错误会作为错误返回给api调用。
您可以在这里找到一个在while循环中使用jobs.query / jobs.getQueryResults的Java示例:https://cloud.google.com/bigquery/querying-data#syncqueries。注意代码如何在queryResponse.getJobComplete()为真之前一直调用getQueryResults,然后通过进一步调用getQueryResults()继续连接分页标记,直到读完整个表。