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 작업에서 다른 방법을 확인하여이를 방지하려고합니다 isDone
.. 내 테스트에서 어떤 이유로 isDone
쿼리가 완료되기 전에 true를 반환합니다. BigQuery 콘솔을 확인할 때 직접 확인합니다. 이로 인해 사용자의 요청은 의도 한대로 메시지를 반환하는 대신 쿼리가 완료 될 때까지 항상 중단됩니다.
쿼리가 계속 실행되는 동안 작업을 어떻게 완료 할 수 있습니까? 작업과 쿼리 사이에 약간의 차이가 있습니까? 아니면 내가 놓친 다른 것이 있습니까? 제안 해 주셔서 감사합니다.
jobs.getQueryResults
timeoutMs
매달린 GET 의미 체계를 제어 하는 선택적 매개 변수가 있습니다. 지정된 간격까지 또는 지정되지 않은 경우 10 초까지 작업 완료를 기다립니다. 작업이 완료되면 상관없이 즉시 반환됩니다.
시간 제한을 0으로 설정하면 즉시 응답이 반환되며 결과 통계를 확인하여 작업이 완료되었는지 확인할 수 있습니다. 그렇다면 응답에는 스키마와 데이터 행의 첫 페이지도 포함되어야합니다.
REST 참조의 추가 정보 : https://cloud.google.com/bigquery/docs/reference/rest/v2/jobs/getQueryResults
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다