使用外部分區資料
您可以使用 BigQuery 外部資料表,查詢下列資料儲存庫中的分區資料:
外部分區資料必須使用預設 Hive 分區配置,且格式必須為下列任一項:
- Avro
- CSV
- JSON
- ORC
- Parquet
如要查詢外部分區資料,您必須建立 BigLake 資料表或外部資料表。我們建議使用 BigLake 資料表,因為您可以透過這類資料表在資料表層級強制執行精細的安全防護機制。如要瞭解 BigLake 和外部資料表,請參閱「BigLake 資料表簡介」和「外部資料表簡介」。
在資料表定義檔中設定相關選項即可支援 Hive 分區。如需查詢代管分區資料表的操作說明,請參閱分區資料表簡介。
分區結構定義
以下各節將說明 預設的 Hive 分割版面配置,以及 BigQuery 支援的結構定義偵測模式。
為避免讀取不必要的檔案並提升效能,您可以在查詢中使用分區索引鍵的述詞篩選器。
支援的資料配置
查詢 Cloud Storage 中的資料時,Hive 分區索引鍵會顯示為一般資料欄。資料必須符合預設 Hive 分區配置。舉例來說,下列檔案均符合預設配置,鍵/值組合會以目錄型式排列並採用等號 (=) 做為分隔符,而且分區索引鍵的順序一律相同:
gs://my_bucket/my_table/dt=2019-10-31/lang=en/my_filename
gs://my_bucket/my_table/dt=2018-10-31/lang=fr/my_filename
本範例中常見的來源 URI 前置字串為 gs://my_bucket/my_table
。
不支援的資料配置
如果分區索引鍵名稱未編碼入目錄路徑,系統將無法偵測分區結構定義。舉例來說,分區索引鍵名稱未編碼入下列路徑:
gs://my_bucket/my_table/2019-10-31/en/my_filename
如果檔案的結構定義順序不一致,系統也無法進行偵測作業。舉例來說,假設下列兩個檔案採用反向分區索引鍵編碼:
gs://my_bucket/my_table/dt=2019-10-31/lang=en/my_filename
gs://my_bucket/my_table/lang=fr/dt=2018-10-31/my_filename
偵測模式
BigQuery 支援三種 Hive 分區結構定義偵測模式:
AUTO
:系統會自動偵測索引鍵名稱與類型。可偵測的類型如下:STRINGS
:系統會自動將索引鍵名稱轉換為STRING
類型。CUSTOM
:分區索引鍵結構定義編碼方式,如來源 URI 前置字串中所指定。
自訂分區索引鍵結構定義
如要使用 CUSTOM
結構定義,您必須在來源 URI 前置字串欄位中指定該結構定義。使用 CUSTOM
結構定義可讓您指定每個分區索引鍵的類型。這些值必須有效地剖析為指定類型,否則查詢作業會失敗。
舉例來說,如果您將 source_uri_prefix
標記設為 gs://my_bucket/my_table/{dt:DATE}/{val:STRING}
,BigQuery 會將 val
視為 STRING、dt
視為 DATE,並使用 gs://my_bucket/my_table
做為相符檔案的來源 URI 前置字串。
分區修剪
BigQuery 會盡可能利用分區索引鍵上的查詢述詞修剪分區。這樣一來,BigQuery 就不會讀取不必要的檔案,有助於提升效能。
查詢中分區鍵的述詞篩選條件
建立外部分區資料表時,您可以啟用 HivePartitioningOptions 下的 requirePartitionFilter
選項,要求在分區鍵上使用述詞篩選器。
啟用此選項後,如嘗試在未指定 WHERE
子句的情況下查詢外部分區資料表,將會產生下列錯誤:Cannot query over table <table_name> without a filter over column(s)
<partition key names> that can be used for partition elimination
。
限制
- 建構 Hive 分區支援時,我們會假設所有 URI 都有一個通用來源 URI 前置字串,字串結尾處緊接在分區編碼之前,如下所示:
gs://BUCKET/PATH_TO_TABLE/
。 - 假設 Hive 分區資料表的目錄結構具有相同的分區索引鍵、索引鍵的顯示順序相同,且每個資料表最多包含十個分區索引鍵。
- 資料必須符合預設 Hive 分區配置。
- Hive 分區索引鍵不得與基礎檔案中的資料欄重疊。
僅支援 GoogleSQL。
查詢儲存在 Cloud Storage 中外部資料來源的所有限制均適用。
後續步驟
- 瞭解分區資料表。
- 瞭解如何在 BigQuery 中使用 SQL。