建立叢集資料表
您可以在 BigQuery 中使用叢集資料表,減少查詢處理的資料量。
使用叢集資料表時,系統會根據指定資料欄 (也稱為叢集資料欄) 的值來整理資料表資料。BigQuery 會依叢集資料欄排序資料,然後將具有相似值的資料列儲存在相同或鄰近的實體區塊中。當查詢根據叢集資料欄進行篩選時,BigQuery 只會有效率地掃描相關區塊,並略過不符合篩選條件的資料。
如要瞭解詳情,請參考下列資源:
事前準備
必要的角色
如要取得建立資料表所需的權限,請要求管理員授予下列 IAM 角色:
-
BigQuery 作業使用者 (
roles/bigquery.jobUser
) 如果您要透過載入資料或將查詢結果儲存至資料表來建立資料表,則需要專案的這項權限。 -
資料集的 BigQuery 資料編輯者 (
roles/bigquery.dataEditor
) ,您要在該資料集建立資料表。
如要進一步瞭解如何授予角色,請參閱「管理專案、資料夾和機構的存取權」。
這些預先定義的角色具備建立資料表所需的權限。如要查看確切的必要權限,請展開「必要權限」部分:
所需權限
如要建立資料表,必須具備下列權限:
-
bigquery.tables.create
在要建立資料表的資料集上。 -
bigquery.tables.getData
如果您要將查詢結果儲存為資料表,則必須擁有查詢參照的所有資料表和檢視區塊的存取權。 -
bigquery.jobs.create
專案,如果您是透過載入資料或將查詢結果儲存至資料表來建立資料表。 -
bigquery.tables.updateData
資料表,如果您要使用查詢結果附加或覆寫資料表。
資料表命名規定
在 BigQuery 中建立資料表時,每個資料集裡的資料表名稱不得重複。資料表名稱可以:
- 包含的字元總計最多 1,024 個 UTF-8 位元組。
- 包含類別 L (字母)、M (符號)、N (數字)、Pc (連接符,包括底線)、Pd (破折號)、Zs (空格) 的 Unicode 字元。詳情請參閱一般類別。
以下都是有效的資料表名稱範例:table 01
、ग्राहक
、00_お客様
、étudiant-01
。
注意事項:
- 根據預設,資料表名稱會區分大小寫。
mytable
和MyTable
可以共存在同一個資料集中,除非是已關閉大小寫區分功能的資料集。 - 部分資料表名稱和資料表名稱前置字串已保留。如果收到錯誤訊息,指出資料表名稱或前置字元已保留,請選取其他名稱,然後再試一次。
如果您在序列中加入多個點運算子 (
.
),系統會自動移除重複的運算子。例如:
project_name....dataset_name..table_name
變成這樣:
project_name.dataset_name.table_name
分群資料欄規定
在 BigQuery 中建立資料表時,您可以指定用於建立叢集資料表的資料欄。資料表建立完成後,您可以修改用於建立叢集資料表的資料欄。詳情請參閱「修改叢集規格」。
叢集資料欄必須是頂層的非重複資料欄,且屬於下列任一項資料類型:
BIGNUMERIC
BOOL
DATE
DATETIME
GEOGRAPHY
INT64
NUMERIC
RANGE
STRING
TIMESTAMP
您最多可指定四個叢集資料欄,當您指定多個叢集資料欄時,資料欄的順序將決定資料的排序方式。舉例來說,如果資料表是依資料欄 a、b、c 來進行叢集,則資料也會按照相同順序排序,即第一順位是資料欄 a、第二順位是資料欄 b、第三順位是資料欄 c。按照最佳做法,最常用以進行資料篩選或匯總的資料欄應排在第一順位。
叢集資料欄順序亦會影響資料查詢的效能與定價。如要瞭解查詢叢集資料表的最佳做法,請參閱查詢叢集資料表一文。
透過結構定義建立空白叢集資料表
如何使用結構定義建立空白叢集資料表:
主控台
前往 Google Cloud 控制台的「BigQuery」頁面。
- 在「Explorer」窗格中展開專案,然後選取資料集。
- 在「資料集資訊」部分,按一下 「建立資料表」。
- 在「建立資料表」面板中,指定下列詳細資料:
- 在「來源」部分,從「使用下列資料建立資料表」清單中選取「空白資料表」。
- 在「目的地」部分,指定下列詳細資料:
- 在「Dataset」(資料集) 部分,選取要建立資料表的資料集。
- 在「Table」(資料表) 欄位中,輸入要建立的資料表名稱。
- 確認「Table type」(資料表類型) 欄位已設為「Native table」(原生資料表)。
- 在「Schema」(結構定義) 區段中,輸入結構定義。
你可以使用下列其中一種方法,手動輸入結構定義資訊:
- 選項 1:按一下「以文字形式編輯」,然後以 JSON 陣列的形式貼上結構定義。如果您使用 JSON 陣列,可透過與建立 JSON 結構定義檔一樣的程序產生結構定義。您可以輸入下列指令,查看現有資料表的 JSON 格式結構定義:
bq show --format=prettyjson dataset.table
- 選項 2:按一下 Type」(類型) 和「Mode」(模式)。 「新增欄位」,然後輸入表格結構定義。指定每個欄位的「Name」(名稱)、「
- 選項 1:按一下「以文字形式編輯」,然後以 JSON 陣列的形式貼上結構定義。如果您使用 JSON 陣列,可透過與建立 JSON 結構定義檔一樣的程序產生結構定義。您可以輸入下列指令,查看現有資料表的 JSON 格式結構定義:
- 針對「Clustering order」(叢集處理順序),輸入一到四個以半形逗號分隔的資料欄名稱。
- 選用步驟:如要使用客戶管理的加密金鑰,請在「Advanced options」(進階選項) 部分選取「Use a customer-managed encryption key (CMEK)」(使用客戶管理的加密金鑰 (CMEK)) 選項。根據預設,BigQuery 會使用 Google-owned and Google-managed encryption key加密靜態儲存的客戶內容。
- 點選「建立資料表」。
SQL
使用 CREATE TABLE
DDL 陳述式指令,並加上 CLUSTER BY
選項。下列範例會在 mydataset
中建立名為 myclusteredtable
的叢集資料表:
前往 Google Cloud 控制台的「BigQuery」頁面。
在查詢編輯器中輸入下列陳述式:
CREATE TABLE mydataset.myclusteredtable ( customer_id STRING, transaction_amount NUMERIC ) CLUSTER BY customer_id OPTIONS ( description = 'a table clustered by customer_id');
按一下「執行」
。
如要進一步瞭解如何執行查詢,請參閱「執行互動式查詢」。
bq
使用加上以下旗標的 bq mk
指令:
--table
(或-t
捷徑)。--schema
。您可利用內嵌方式或以 JSON 結構定義檔提供資料表結構定義。--clustering_fields
。您最多可指定四個叢集資料欄。
可選用的參數包括 --expiration
、--description
、--time_partitioning_type
、--time_partitioning_field
、--time_partitioning_expiration
、--destination_kms_key
和 --label
。
如要建立非預設專案中的資料表,請使用下列格式將專案 ID 新增至資料集:project_id:dataset
。
本文不示範 --destination_kms_key
。如要進一步瞭解如何使用 --destination_kms_key
,請參閱客戶管理的加密金鑰說明。
輸入下列指令,建立含有結構定義的空白叢集資料表:
bq mk \ --table \ --expiration INTEGER1 \ --schema SCHEMA \ --clustering_fields CLUSTER_COLUMNS \ --description "DESCRIPTION" \ --label KEY:VALUE,KEY:VALUE \ PROJECT_ID:DATASET.TABLE
更改下列內容:
INTEGER1
:資料表的預設生命週期 (以秒為單位)。最小值是 3,600 秒 (1 小時)。到期時間為目前世界標準時間加整數值。如果您在建立資料表時設定了資料表到期時間,系統會忽略資料集的預設資料表到期時間設定。設定這個值會在指定時間到期後刪除資料表。SCHEMA
:格式為COLUMN:DATA_TYPE,COLUMN:DATA_TYPE
的內嵌結構定義,或您本機電腦上的 JSON 結構定義檔案路徑。CLUSTER_COLUMNS
:以逗號分隔的清單,最多包含四個叢集資料欄。清單不得包含任何空格。DESCRIPTION
:置於括號中的資料表說明。KEY:VALUE
:代表標籤的鍵/值組合。您可以用逗號分隔的清單輸入多個標籤。PROJECT_ID
:您的專案 ID。DATASET
:專案中的資料集。TABLE
:您要建立的資料表名稱。
您在指令列中指定結構定義時,無法加入 RECORD
(STRUCT
) 類型和資料欄說明,也不能指定資料欄模式。所有模式均預設為 NULLABLE
。如要加入說明、模式和 RECORD
類型,請改為提供 JSON 結構定義檔。
範例:
輸入下列指令,在預設專案中的 mydataset
內建立名為 myclusteredtable
的叢集資料表,資料表到期時間設為 2,592,000 秒 (1 個月 30 天)、說明設為 This is my clustered table
,而標籤則設為 organization:development
。此指令使用 -t
捷徑,而非 --table
。
結構定義以內嵌方式指定為:timestamp:timestamp,customer_id:string,transaction_amount:float
。所指定的叢集欄位 customer_id
用於叢集資料表。
bq mk \
-t \
--expiration 2592000 \
--schema 'timestamp:timestamp,customer_id:string,transaction_amount:float' \
--clustering_fields customer_id \
--description "This is my clustered table" \
--label org:dev \
mydataset.myclusteredtable
輸入下列指令,在 myotherproject
(而非預設專案) 中建立名為 myclusteredtable
的叢集資料表,說明設為 This is my clustered table
,標籤則設為 organization:development
。此指令使用 -t
捷徑,而非 --table
。這個指令不會指定資料表到期時間。如果資料集有預設資料表到期時間,系統會直接套用這個時間。如果資料集沒有預設資料表到期時間,資料表將永不過期。
結構定義在本機 JSON 檔案 /tmp/myschema.json
中指定。customer_id
欄位用於叢集資料表。
bq mk \
-t \
--expiration 2592000 \
--schema /tmp/myschema.json \
--clustering_fields=customer_id \
--description "This is my clustered table" \
--label org:dev \
myotherproject:mydataset.myclusteredtable
Terraform
使用 google_bigquery_table
資源。
如要向 BigQuery 進行驗證,請設定應用程式預設憑證。詳情請參閱「設定用戶端程式庫的驗證機制」。
下列範例會建立名為 mytable
的資料表,並以 ID
和 Created
資料欄做為叢集依據:
如要在 Google Cloud 專案中套用 Terraform 設定,請完成下列各節的步驟。
準備 Cloud Shell
- 啟動 Cloud Shell。
-
設定要套用 Terraform 設定的預設 Google Cloud 專案。
每項專案只需要執行一次這個指令,且可以在任何目錄中執行。
export GOOGLE_CLOUD_PROJECT=PROJECT_ID
如果您在 Terraform 設定檔中設定明確值,環境變數就會遭到覆寫。
準備目錄
每個 Terraform 設定檔都必須有自己的目錄 (也稱為根模組)。
-
在 Cloud Shell 中建立目錄,並在該目錄中建立新檔案。檔案名稱的副檔名必須是
.tf
,例如main.tf
。在本教學課程中,這個檔案稱為main.tf
。mkdir DIRECTORY && cd DIRECTORY && touch main.tf
-
如果您正在學習教學課程,可以複製每個章節或步驟中的範例程式碼。
將範例程式碼複製到新建立的
main.tf
中。視需要從 GitHub 複製程式碼。如果 Terraform 程式碼片段是端對端解決方案的一部分,建議您使用這個方法。
- 查看並修改範例參數,套用至您的環境。
- 儲存變更。
-
初始化 Terraform。每個目錄只需執行一次這項操作。
terraform init
如要使用最新版 Google 供應商,請加入
-upgrade
選項:terraform init -upgrade
套用變更
-
檢查設定,確認 Terraform 即將建立或更新的資源符合您的預期:
terraform plan
視需要修正設定。
-
執行下列指令,並在提示中輸入
yes
,套用 Terraform 設定:terraform apply
等待 Terraform 顯示「Apply complete!」訊息。
- 開啟 Google Cloud 專案即可查看結果。在 Google Cloud 控制台中,前往 UI 中的資源,確認 Terraform 已建立或更新這些資源。
API
使用指定 clustering.fields
屬性和 schema
屬性的已定義資料表資源呼叫 tables.insert
方法。
Python
在試行這個範例之前,請先按照 BigQuery 快速入門導覽課程:使用用戶端程式庫中的 Python 設定說明進行操作。詳情請參閱 BigQuery Python API 參考說明文件。
如要向 BigQuery 進行驗證,請設定應用程式預設憑證。 詳情請參閱「設定用戶端程式庫的驗證機制」。
Go
在試行這個範例之前,請先按照 BigQuery 快速入門導覽課程:使用用戶端程式庫中的 Go 設定說明進行操作。詳情請參閱 BigQuery Go API 參考說明文件。
如要向 BigQuery 進行驗證,請設定應用程式預設憑證。 詳情請參閱「設定用戶端程式庫的驗證機制」。
Java
在試行這個範例之前,請先按照 BigQuery 快速入門導覽課程:使用用戶端程式庫中的 Java 設定說明進行操作。詳情請參閱 BigQuery Java API 參考說明文件。
如要向 BigQuery 進行驗證,請設定應用程式預設憑證。 詳情請參閱「設定用戶端程式庫的驗證機制」。
從查詢結果建立叢集資料表
從查詢結果建立叢集資料表的作法有兩種:
- 將結果寫入新的目的地資料表並指定叢集資料欄,
- 使用 DDL
CREATE TABLE AS SELECT
陳述式。如要進一步瞭解此做法,請參閱「使用資料定義語言陳述式」頁面中的從查詢結果建立叢集資料表一節。
您可以藉由查詢分區資料表或非分區資料表的方式建立叢集資料表,但不能利用查詢結果將現有的資料表變更為叢集資料表。
當您從查詢結果建立叢集資料表時,必須要使用標準 SQL。目前,系統不支援使用舊版 SQL 查詢叢集資料表或將查詢結果寫入叢集資料表。
SQL
如要從查詢結果建立叢集資料表,請使用 CREATE TABLE
DDL 陳述式搭配 CLUSTER BY
選項。下列範例會查詢現有的非叢集資料表,建立依 customer_id
叢集的新資料表:
前往 Google Cloud 控制台的「BigQuery」頁面。
在查詢編輯器中輸入下列陳述式:
CREATE TABLE mydataset.clustered_table ( customer_id STRING, transaction_amount NUMERIC ) CLUSTER BY customer_id AS ( SELECT * FROM mydataset.unclustered_table );
按一下「執行」
。
如要進一步瞭解如何執行查詢,請參閱「執行互動式查詢」。
bq
輸入下列指令,從查詢結果中建立新的叢集目的地資料表:
bq --location=LOCATION query \ --use_legacy_sql=false 'QUERY'
更改下列內容:
LOCATION
:您位置的名稱。--location
是選用旗標。舉例來說,如果您在東京地區使用 BigQuery,就可以將旗標的值設為asia-northeast1
。您可以使用 .bigqueryrc 檔案設定位置的預設值。QUERY
:採用 GoogleSQL 語法的查詢。目前您無法使用舊版 SQL 查詢叢集資料表或是將查詢結果寫入叢集資料表。該查詢可包含CREATE TABLE
DDL 陳述式,以指定建立叢集資料表的選項。您可以使用 DDL 取代指定個別指令列旗標的做法。
範例:
輸入下列指令,將查詢結果寫入 mydataset
中名為 myclusteredtable
的叢集目的地資料表。mydataset
在您的預設專案中。查詢會從非分區資料表 mytable 中擷取資料,資料表的 customer_id
資料欄用於叢集資料表。資料表的 timestamp
資料欄用於建立分區資料表。
bq query --use_legacy_sql=false \
'CREATE TABLE
mydataset.myclusteredtable
PARTITION BY
DATE(timestamp)
CLUSTER BY
customer_id
AS (
SELECT
*
FROM
`mydataset.mytable`
);'
API
如要將查詢結果儲存到叢集資料表,請呼叫 jobs.insert
方法、設定 query
工作,然後加入可建立叢集資料表的 CREATE TABLE
DDL 陳述式。
在工作資源的 jobReference
區段中,利用 location
屬性指定您的位置。
在載入資料時建立叢集資料表
您載入資料到一個新的資料表時,可透過指定叢集欄的方式來建立叢集資料表。您不必在資料載入資料表之前,事先建立空白的資料表,因為您可以同時建立叢集資料表並載入資料。
有關如何載入資料的詳情,請參閱將資料載入 BigQuery 的簡介。
如要在定義載入工作時定義叢集,請進行以下操作:
SQL
使用 LOAD DATA
陳述式。以下範例會載入 AVRO 資料,建立依 transaction_date
欄位分區,並依 customer_id
欄位叢集化的資料表。並將分區設定為三天後失效。
前往 Google Cloud 控制台的「BigQuery」頁面。
在查詢編輯器中輸入下列陳述式:
LOAD DATA INTO mydataset.mytable PARTITION BY transaction_date CLUSTER BY customer_id OPTIONS ( partition_expiration_days = 3) FROM FILES( format = 'AVRO', uris = ['gs://bucket/path/file.avro']);
按一下「執行」
。
如要進一步瞭解如何執行查詢,請參閱「執行互動式查詢」。
API
如要在透過載入工作建立資料表時定義叢集設定,您可以填入資料表的 Clustering
屬性。
Go
在試行這個範例之前,請先按照 BigQuery 快速入門導覽課程:使用用戶端程式庫中的 Go 設定說明進行操作。詳情請參閱 BigQuery Go API 參考說明文件。
如要向 BigQuery 進行驗證,請設定應用程式預設憑證。 詳情請參閱「設定用戶端程式庫的驗證機制」。
Java
在試行這個範例之前,請先按照 BigQuery 快速入門導覽課程:使用用戶端程式庫中的 Java 設定說明進行操作。詳情請參閱 BigQuery Java API 參考說明文件。
如要向 BigQuery 進行驗證,請設定應用程式預設憑證。 詳情請參閱「設定用戶端程式庫的驗證機制」。
Python
在試行這個範例之前,請先按照 BigQuery 快速入門導覽課程:使用用戶端程式庫中的 Python 設定說明進行操作。詳情請參閱 BigQuery Python API 參考說明文件。
如要向 BigQuery 進行驗證,請設定應用程式預設憑證。 詳情請參閱「設定用戶端程式庫的驗證機制」。
後續步驟
- 如要瞭解如何使用叢集資料表,請參閱管理叢集資料表。
- 關於如何查詢叢集資料表,請參閱查詢叢集資料表一文。
- 如需 BigQuery 中的分區資料表支援總覽,請參閱分區資料表簡介一文。
- 如要瞭解如何建立分區資料表,請參閱建立分區資料表。
- 如要查看
INFORMATION_SCHEMA
的總覽,請參閱「BigQueryINFORMATION_SCHEMA
簡介」。