我有一个使用 BigQuery 创建 tsv 表的 scala 应用程序。当用户尝试访问数据时,如果查询作业完成,我想返回它,否则告诉他们它仍在运行。
我的查询作业创建如下所示:
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 Job: 上的另一种方法来防止这种情况发生isDone
。出于某种原因,在我的测试中,isDone
在查询完成之前返回 true。我在检查 BigQuery 控制台时看到了这一点。这会导致用户的请求始终停止,直到查询完成,而不是按预期返回消息。
如何在查询仍在运行时完成作业?我错过了工作和查询之间的一些区别吗?或者还有什么我错过的?感谢您提出的任何建议。