Google BigQuery API 在 Clojure 中获取 运行 工作非美国位置的状态

Google BigQuery API get state of running job non-US location in Clojure

我有一个应用程序可以读取 CSV 文件并将其推送到 BQ 表,在执行下一个 CSV 文件之前检查该作业的状态等等。当我的数据集在美国地区时,这工作正常,但是我们最近将我们的数据集移到了澳大利亚地区,现在我得到

#error { :cause 404 Not Found { "code" : 404, "errors" : [ { "domain" : "global", "message" : "Not found: Job load-csv-job123", "reason" : "notFound" }

虽然我可以 运行 这个数据集的工作很好,但我不能在我的 Clojure 代码中调用 BQ get API 来获取状态。调用插入作业时 API 我在 jobReference

中设置位置

job-reference (doto (JobReference.) (.setLocation "australia-southeast1") (.setJobId job-id) ) 然后像这样调用我的插入

 status (->> bq
                    (.jobs)
                    (#(.insert % project-id job-spec content))
                    (.execute)
                    (.getStatus))]

上面的状态在我(->> status (.getState)

时有效

我知道我必须为 non-US/non-EU 区域的某处设置位置,以便在工作中调用 GET,但无法弄清楚如何使用 GET API.

https://cloud.google.com/bigquery/docs/reference/rest/v2/jobs/get

我在下面的代码中使用的API/jar

[com.google.apis/google-api-services-bigquery "v2-rev459-1.25.0"]

我使用 recur

在循环中获取状态的代码
(loop [status status]                                   ;; Waiting until successfully processed
      (log/info job-id " : " (->> status (.getState)))
      (if (= "DONE" (->> status (.getState)))
        (do (log/info "Status seems done?")
          (if-let [errors (.getErrors status)]
            (do
              (log/info "seems like we have errors")
              (vec (map #(.getMessage %) errors)))
            nil))
        (do
          (log/info "status is pending let's wait and check...job spec" job-spec)
          (Thread/sleep 3000)

          (recur (->> bq
                      (.jobs)
                      (#(.get % project-id job-id))
                      (.execute)
                      (.getStatus))
                 ))))))

你能告诉我遗漏了什么吗,我尝试在 .get 上设置位置 (#(.get % project-id job-id))(.setLocation "australia-southeast1") 回来

CompilerException java.lang.IllegalArgumentException: No matching field found: setLocation for class java.lang.String, compiling:```

此处缺少的内容似乎是有关您正在使用哪个 clojure 库的详细信息。这不是第一方库支持的语言,因此这可能归结为库的组装方式以及是否得到维护。

对于 jobs get 调用,正确路由请求所需的是向请求添加 location URL 参数,例如GET https://bigquery.googleapis.com/bigquery/v2/projects/yourprojectid/jobs/yourjobid?location=australia-southeast1

我设法弄清楚了当数据集从一个区域移动到另一个区域时如何设置位置的 Clojure 代码,这需要获取已经 运行 的作业的状态。请注意,在我的情况下,我必须确保在 运行 下一个作业之前,上一个 BQ 作业(插入 table)已经完成。我遍历状态并重复它直到我完成。请注意,这里的 DONE 并不意味着工作成功,只是工作已经完成。这就是为什么如果有任何错误我会在下面获取 err vec 并且 return that.

我最初为此使用了线程形式 ->> 但不知道如何以这种方式设置位置,所以现在使用普通形式。稍后我会用线程形式更新。

(loop [status status]                                   ;; Waiting until successfully processed
      (log/info job-id " : " (->> status (.getState)))
      (if (= "DONE" (->> status (.getState)))
        (do (if-let [errors (.getErrors status)]
              (do
                (log/debug "Errors in job: " job-id)
                (vec (map #(.getMessage %) errors)))
              nil))
        (do
          (Thread/sleep 3000)
          (recur
            (let [jobsobj (.jobs bq)
                  
                  getobj (.get jobsobj project-id job-id)
                  _ (.setLocation getobj "australia-southeast1")
                  ]
               (.getStatus (.execute getobj)))
            ))))