資料表取樣

BigQuery 的資料表取樣功能可讓您查詢大型資料表中的隨機資料子集。使用 TABLESAMPLE 子句分析各種記錄,即可探索大型資料集,同時避免掃描及處理整個資料表時產生相關費用。

使用資料表取樣

如要在查詢中使用資料表取樣,請加入 TABLESAMPLE 子句。舉例來說,下列查詢會選取資料表中約 10% 的資料:

SELECT * FROM dataset.my_table TABLESAMPLE SYSTEM (10 PERCENT)

與 LIMIT 子句不同,TABLESAMPLE 會傳回資料表的隨機資料子集。此外,BigQuery 不會快取包含 TABLESAMPLE 子句的查詢結果,因此查詢每次傳回的結果可能不同。

您可以將 TABLESAMPLE 子句與其他選取條件結合。以下範例會對資料表約 50% 的內容進行取樣,然後套用 WHERE 子句:

SELECT *
FROM dataset.my_table TABLESAMPLE SYSTEM (50 PERCENT)
WHERE customer_id = 1

下一個範例結合了 TABLESAMPLE 子句和 JOIN 子句:

SELECT *
FROM dataset.table1 T1 TABLESAMPLE SYSTEM (10 PERCENT)
JOIN dataset.table2 T2 TABLESAMPLE SYSTEM (20 PERCENT) USING (customer_id)

如果是較小的資料表,當您彙整兩個樣本,但沒有任何取樣資料列符合彙整條件時,可能會收到空白結果。

您可以將百分比指定為查詢參數。下例說明如何使用 bq 指令列工具,將百分比傳遞至查詢:

bq query --use_legacy_sql=false --parameter=percent:INT64:29 \
    'SELECT * FROM `dataset.my_table` TABLESAMPLE SYSTEM (@percent PERCENT)`

BigQuery 資料表會整理成資料區塊。TABLESAMPLE 子句的運作方式是從資料表中隨機選取一定百分比的資料區塊,並讀取所選區塊中的所有資料列。取樣精細程度受限於資料區塊數量。

一般來說,如果資料表或資料表分區大於約 1 GB,BigQuery 會將其分割成區塊。較小的資料表可能由單一資料區塊組成。在這種情況下,TABLESAMPLE 子句會讀取整個資料表。如果取樣百分比大於零,且資料表並非空白,則資料表取樣一律會傳回部分結果。

區塊的大小可能不同,因此取樣的資料列確切比例可能會有差異。如要對個別資料列 (而非資料區塊) 進行取樣,則可改用 WHERE rand() < K 子句。不過,這個方法需要 BigQuery 掃描整個資料表。如要節省費用,但仍想享有資料列層級取樣的好處,可以結合這兩種技術。

以下範例會從儲存空間讀取約 20% 的資料區塊,然後隨機選取這些區塊中 10% 的資料列:

SELECT * FROM dataset.my_table TABLESAMPLE SYSTEM (20 PERCENT)
WHERE rand() < 0.1

外部資料表

您可以對將資料儲存在一組檔案中的外部資料表使用 TABLESAMPLE 子句。BigQuery 會對資料表參照的外部檔案子集進行取樣。如果是某些檔案格式,BigQuery 可以將個別檔案分割成區塊,以便取樣。部分外部資料 (例如 Google 試算表中的資料) 是由單一檔案組成,系統會將其視為一個資料區塊進行取樣。

從寫入最佳化儲存空間取樣

如果您將資料表取樣與串流資料即時插入搭配使用,BigQuery 會從寫入最佳化儲存空間中取樣樣本資料。在某些情況下,寫入最佳化儲存空間中的所有資料都會以單一區塊表示。發生這種情況時,寫入最佳化儲存空間中的所有資料都會顯示在結果中,或完全不顯示。

分區和分群資料表

分區和分群會產生區塊,特定區塊內的所有資料列都具有相同的分區鍵,或具有值相近的分群屬性。因此,這些資料表的樣本集往往比非分區、非分群資料表的樣本集更偏頗。

限制

  • 取樣資料表在查詢陳述式中只能出現一次。這項限制包括檢視表定義中參照的資料表。
  • 不支援從檢視表取樣資料。
  • 不支援對子查詢或資料表值函式呼叫的結果進行取樣。
  • 不支援從陣列掃描中取樣,例如呼叫 UNNEST 運算子的結果。
  • 不支援在 IN 子查詢中取樣。
  • 不支援從已套用資料列層級安全性的資料表取樣。

資料表取樣定價

如果您使用隨選計費模式,則須支付讀取取樣資料的費用。BigQuery 不會快取包含 TABLESAMPLE 子句的查詢結果,因此每次執行都會產生從儲存空間讀取資料的費用。