查询完成前完成的 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