【问题标题】:Google BigQuery API get state of running job non-US location in ClojureGoogle BigQuery API 获取 Clojure 中非美国位置运行作业的状态
【发布时间】:2020-09-30 13:43:42
【问题描述】:

我有一个应用程序可以读取 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 从 Google Docs 中进行操作。

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 google-bigquery


    【解决方案1】:

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

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

    【讨论】:

    • 是的,我正在使用 [com.google.apis/google-api-services-bigquery "v2-rev459-1.25.0"] API /库。我正在寻找可以帮助我在 ->> 调用 .get 上设置位置的代码
    • 我不知道它在 clojure 中是如何体现的,但在 java 中它是 setLocation() 在工作中得到调用:developers.google.com/resources/api-libraries/documentation/…
    • 感谢指点,是的,我遇到了那个 API 文档,但是为此需要 Clojure 中的一些东西。
    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2011-05-09
      • 1970-01-01
      • 2019-08-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-25
      相关资源
      最近更新 更多