查询完成前完成的 Bigquery 作业状态
Big Query Job state done before the query finishes
我有一个使用 BigQuery 创建 tsv table 的 Scala 应用程序。当用户尝试访问我想要的数据时,如果查询作业已完成,我会 return ,否则告诉他们它仍然是 运行.
我的查询作业创建如下所示:
bigQuery.create(
JobInfo.of(
QueryJobConfiguration
.newBuilder(mySql)
.setAllowLargeResults(true)
.setDestinationTable(TableId.of("MyReports", s"${tableName}_$random".replace("-", "_")))
.setWriteDisposition(JobInfo.WriteDisposition.WRITE_TRUNCATE)
.setCreateDisposition(JobInfo.CreateDisposition.CREATE_IF_NEEDED)
.setUseLegacySql(false)
.build()
)
)
获取数据的方法如下所示:
override def getData(jobId: String): IO[Either[Throwable, String]] = {
bigQueryService.getMyJob(jobId).map {
case Right(None) | Right(Some(null)) => Right("Data not found, check provided job name")
case Right(Some(r)) =>
if (r.isDone) {
Try(r.getQueryResults()
.iterateAll()
.asScala
.map(_.asScala.map(_.getValue.toString).mkString("\t"))
.mkString("\n")
).toEither
} else {
Right(s"Job not completed, current status is ${r.getStatus.getState.toString}")
}
case Left(err: Throwable) => Left(err)
}
}
我在何处使用 Cats Effect IO 在计算结束时进行评估。我的问题是作业上的 getQueryResults
方法会停止,直到查询完成。我试图通过检查 BQ 作业上的另一种方法来防止这种情况:isDone
。由于某些原因,在我的测试中,isDone
return 在查询完成之前为真。我在检查 BigQuery 控制台时自己看到了这一点。这会导致用户的请求始终停止,直到查询完成,而不是 return 按预期发送消息。
如何在查询仍在运行时完成作业?我错过了工作和查询之间的一些区别吗?或者还有其他我错过的东西吗?感谢您提出任何建议。
jobs.getQueryResults
有一个可选的 timeoutMs
参数来管理其挂起的 GET 语义。它等待作业完成直到指定的时间间隔或 10 秒(如果未指定)。如果作业已完成,则 return 立即执行。
如果您将超时设置为零,它将 return 立即响应,您可以检查结果统计信息以查看作业是否完成。如果是这样,响应还应包含模式和第一页数据行。
来自 REST 参考的其他信息:https://cloud.google.com/bigquery/docs/reference/rest/v2/jobs/getQueryResults
我有一个使用 BigQuery 创建 tsv table 的 Scala 应用程序。当用户尝试访问我想要的数据时,如果查询作业已完成,我会 return ,否则告诉他们它仍然是 运行.
我的查询作业创建如下所示:
bigQuery.create(
JobInfo.of(
QueryJobConfiguration
.newBuilder(mySql)
.setAllowLargeResults(true)
.setDestinationTable(TableId.of("MyReports", s"${tableName}_$random".replace("-", "_")))
.setWriteDisposition(JobInfo.WriteDisposition.WRITE_TRUNCATE)
.setCreateDisposition(JobInfo.CreateDisposition.CREATE_IF_NEEDED)
.setUseLegacySql(false)
.build()
)
)
获取数据的方法如下所示:
override def getData(jobId: String): IO[Either[Throwable, String]] = {
bigQueryService.getMyJob(jobId).map {
case Right(None) | Right(Some(null)) => Right("Data not found, check provided job name")
case Right(Some(r)) =>
if (r.isDone) {
Try(r.getQueryResults()
.iterateAll()
.asScala
.map(_.asScala.map(_.getValue.toString).mkString("\t"))
.mkString("\n")
).toEither
} else {
Right(s"Job not completed, current status is ${r.getStatus.getState.toString}")
}
case Left(err: Throwable) => Left(err)
}
}
我在何处使用 Cats Effect IO 在计算结束时进行评估。我的问题是作业上的 getQueryResults
方法会停止,直到查询完成。我试图通过检查 BQ 作业上的另一种方法来防止这种情况:isDone
。由于某些原因,在我的测试中,isDone
return 在查询完成之前为真。我在检查 BigQuery 控制台时自己看到了这一点。这会导致用户的请求始终停止,直到查询完成,而不是 return 按预期发送消息。
如何在查询仍在运行时完成作业?我错过了工作和查询之间的一些区别吗?或者还有其他我错过的东西吗?感谢您提出任何建议。
jobs.getQueryResults
有一个可选的 timeoutMs
参数来管理其挂起的 GET 语义。它等待作业完成直到指定的时间间隔或 10 秒(如果未指定)。如果作业已完成,则 return 立即执行。
如果您将超时设置为零,它将 return 立即响应,您可以检查结果统计信息以查看作业是否完成。如果是这样,响应还应包含模式和第一页数据行。
来自 REST 参考的其他信息:https://cloud.google.com/bigquery/docs/reference/rest/v2/jobs/getQueryResults