2013-12-16 25 views
0

我試圖運行多個同時作業,以便將大約700K記錄加載到單個BigQuery表。我的代碼(Java)根據job的記錄創建模式,並根據需要更新BigQuery模式。BigQuery架構錯誤,儘管更新架構

工作流程如下:

  1. 單個作業創建表和設定(初始)架構。
  2. 對於每個加載作業,我們都會從作業記錄中創建模式。然後,我們從BigQuery中抽取現有的表模式,如果它不是與作業相關聯的模式的超集,我們使用新的合併模式更新模式。最後一部分(從拉取現有模式開始)同步(使用鎖定) - 一次只有一個作業執行它。模式的更新使用UPDATE方法,並且僅在客戶端更新方法返回後纔會釋放鎖。

我期待避免使用此工作流遇到模式更新錯誤。我假設一旦客戶端從更新作業返回,那麼表就會更新,並且正在進行的作業不會因模式更新而受到傷害。

儘管如此,我仍然不時地遇到模式更新錯誤。更新方法是否爲原子?我如何知道模式實際更新的時間?

回答

0

BigQuery中的更新是原子的,但它們在作業結束時應用。作業完成時,確保模式是等同的。如果在作業運行時有架構更新,則此檢查將失敗。

我們應該確保模式是兼容的而不是等效的。如果您使用兼容模式(即您擁有表模式的子集)執行追加操作,但是目前BigQuery不允許這樣做。我會提交一個錯誤。

+0

對於不包含模式(僅數據)的加載作業,與此作業相關聯的模式(將確保模式等效的模塊將失敗)。請注意,在我的用例中,沒有作業(期望創建表的人)包含模式。所有模式更新都使用UPDATE表完成,所有加載作業不包含模式。 – Lior

+1

作業開始時的模式在作業結束時被複制和驗證。它旨在防止在加載作業運行時發生不兼容的模式更改(例如截斷表作業),然後使新數據提交併損壞表。這可能如下所示:1.啓動加載作業2.截斷表並更改模式3.使用舊模式加載作業提交。 –