2013-05-31 118 views
3

我將在bigquery上維護數據庫的本地副本。我將使用API​​和tabledata:列表。這個數據庫不是我自己的,並且由維護人員通過附加新數據定期更新(比如每小時)。定期更新的bigquery數據庫中的記錄順序

  1. 首先,我可以假設的是,當這個數據被附加,它會肯定被添加到數據庫中的結束?

  2. 現在,我們假設當前數據庫有1,000,000行,現在我正在通過tabledata:list分頁來下載所有這些數據。另外,我們假設數據庫在中途更新(有10,000行)。通過使用頁面標記,我可以確信,只有當我按照它們在數據庫中的順序開始時,我纔會下載存在的1m行?

  3. 最後,現在讓我們說,我來更新我的副本。如果我啓動startIndex爲1,000,000的tabledata:list,並且使用1000的maxResults,那麼是否會得到10個包含我期望的更新數據的頁面?

我想所有這些問題歸結爲是否的BigQuery尊重數據的順序,這個順序是使用資料表:清單及附加數據是否保證遵循以前的數據。由於有一列的值是唯一的,我可以執行一個簡單的select count(1) from table來獲取表的長度,我當然可以通過比較本地數據庫的長度和本地數據庫的長度來檢查我的本地副本是否完整但如果上述情況不能保證,並且數據中出現漏洞,則由於主鍵不是連續的(否則我可以只填寫缺失的行)和數據庫非常大。

+0

您不能通過SELECT * FROM table WHERE firstcol> = 100來執行增量加載嗎? –

+1

問題是每個查詢都會處理整個數據庫,所以每次更新(可能每10分鐘一次,因此每月超過4000次),我會處理當前415mb => 1.7tb/month,即使我只是略讀了前幾千名。最簡單,最快,最便宜的方法是使用tabledata:list,我只需要確認我的假設是有效的。 – nitrous

回答

6
  1. 當您附加數據時,我們會追加到表數據列表的末尾,但是,bigquery可能會週期性地合併數據,這不會影響排序。我們一直在討論能否保持排序,或者至少有一種方法可以訪問最新的數據,但這還沒有實現或設計。如果這是您的重要功能,請告訴我們,我們會相應地優先處理它。

  2. 如果您使用頁面標記,則可以確保您獲得穩定的列表。如果在通過數據分頁的過程中表格得到更新,那麼當您創建頁面令牌時,您仍然只能看到表格中的數據。請注意,因此,頁面標記僅在24小時內有效。

  3. 只要自您更新了表格以來沒有發生聚結,這應該起作用。

您可以通過調用tables.get來獲取表中的行數,這通常比運行查詢更簡單快捷。

+0

謝謝,那太好了。這種融合多久發生一次?對於我來說,能夠訪問最近的數據_somehow_(無需實際執行查詢)是非常重要的,無論是通過保存訂單還是其他機制。另外,這個工具也會被其他人定期地使用。如果你可以優先考慮它,這將是非常有益的,謝謝:) – nitrous

+1

合併發生的順序是每300次將數據附加到表中。 –

+0

我剛剛有一個想法 - 對於表的所有者(可選)選擇默認的排序順序,比如'Col_A asc,Col_B des',是否可行?然後,每當表發生變化時,它將自動按「SELECT * FROM table ORDER BY Col_A ASC,Col_B DESC;'查詢進行排序,其結果將用於所有tabledata:list請求。我想這也可以取代自動排序功能被激活的表上的合併工作。 – nitrous