Google BigQuery API获取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)时,上述状态有效

我知道我必须在工作中为非美国/非欧盟地区设置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"]

我有一个代码,用于在循环中获取状态,重复

(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上设置Location(#(.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调用,请求正确路由所需要的是向请求添加locationURL参数,例如GET https://bigquery.googleapis.com/bigquery/v2/projects/yourprojectid/jobs/yourjobid?location=australia-southeast1

当数据集从一个区域移动到另一个区域时,我设法弄清楚了如何设置位置的Clojure代码,这需要获得已经运行的作业的状态。请注意,在我运行下一个作业之前,我必须确保上一个BQ作业(插入到表中(已经完成。我循环浏览状态并重复它,直到我完成为止。请注意,这里的完成并不意味着工作的成功,只是工作已经完成。这就是为什么如果有任何错误,我会获取下面的错误向量并返回。

我最初使用的是线程形式->>,但不知道如何以这种方式设置Location,所以现在使用了普通形式。稍后我将使用线程形式进行更新。

(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)))
))))

最新更新