使用資訊清單查詢開放式資料表格式
本文說明如何使用資訊清單檔案,查詢以開放式資料表格式 (例如 Apache Hudi 和 Delta Lake) 儲存的資料。
部分開放資料表格式 (例如 Hudi 和 Delta Lake) 會將目前狀態匯出為一或多個資訊清單檔案。資訊清單檔案包含構成資料表的資料檔案清單。BigQuery 支援資訊清單,因此您可以查詢及載入以開放資料表格式儲存的資料。
事前準備
-
Enable the BigQuery Connection, BigQuery Reservation, and BigLake APIs.
如要建立 BigLake 資料表,可以使用下列任一方法執行 Spark 指令:
建立 Dataproc 叢集。如要查詢 Hudi 資料表,請將
--optional-components
欄位設為HUDI
。如要查詢 Delta 資料表,請將--optional-components
設為Presto
。在 BigQuery 中使用 Spark 的預存程序。請按照以下步驟操作:
如要在 Cloud Storage 中儲存資訊清單檔案,請建立 Cloud Storage 值區。您必須連線至 Cloud Storage bucket,才能存取資訊清單檔案。請按照以下步驟操作:
必要的角色
如要根據 Hudi 和 Delta Lake 資料查詢 BigLake 資料表,請確認您具備下列角色:
- BigQuery Connection 使用者 (
roles/bigquery.connectionUser
) - BigQuery 資料檢視者 (
roles/bigquery.dataViewer
) - BigQuery 使用者 (
roles/bigquery.user
)
您也可以查詢 Hudi 外部資料表。不過,建議您將外部資料表升級為 BigLake。 如要查詢 Hudi 外部資料表,請確認您具備下列角色:
- BigQuery 資料檢視者 (
roles/bigquery.dataViewer
) - BigQuery 使用者 (
roles/bigquery.user
) - Storage 物件檢視者 (
roles/storage.objectViewer
)
視權限而定,您可以自行授予這些角色,或請管理員授予。如要進一步瞭解如何授予角色,請參閱查看可針對資源授予的角色。
如要查看查詢 BigLake 表格所需的確切權限,請展開「必要權限」部分:
所需權限
bigquery.connections.use
bigquery.jobs.create
bigquery.readsessions.create
(只有在使用 BigQuery Storage Read API 讀取資料時才需要)bigquery.tables.get
bigquery.tables.getData
查詢 Hudi 工作負載
如要查詢 Hudi 資料,請按照下列步驟操作:
- 根據 Hudi 資料建立外部資料表。
- 將外部資料表升級為 BigLake。
建立 Hudi 外部資料表
使用 Hudi 和 BigQuery 的同步工具同步處理資料表時,請啟用 use-bq-manifest-file
標記,改用資訊清單檔案方法。這個標記也會匯出 BigQuery 支援格式的資訊清單檔案,並使用該檔案建立外部資料表,名稱則為 --table
參數中指定的名稱。
如要建立 Hudi 外部資料表,請按照下列步驟操作:
如要建立 Hudi 外部資料表,請將工作提交至現有的 Dataproc 叢集。建構 Hudi-BigQuery 連接器時,請啟用
use-bq-manifest-file
標記,改用資訊清單檔案方法。這個標記會匯出 BigQuery 支援格式的資訊清單檔案,並使用該檔案建立外部資料表,名稱則由--table
參數指定。spark-submit \ --master yarn \ --packages com.google.cloud:google-cloud-bigquery:2.10.4 \ --class org.apache.hudi.gcp.bigquery.BigQuerySyncTool \ JAR \ --project-id PROJECT_ID \ --dataset-name DATASET \ --dataset-location LOCATION \ --table TABLE \ --source-uri URI \ --source-uri-prefix URI_PREFIX \ --base-path BASE_PATH \ --partitioned-by PARTITION_BY \ --use-bq-manifest-file
更改下列內容:
JAR
:如果您使用 Hudi-BigQuery 連接器,請指定hudi-gcp-bundle-0.14.0.jar
。如果您在 Dataproc 2.1 中使用 Hudi 元件,請指定/usr/lib/hudi/tools/bq-sync-tool/hudi-gcp-bundle-0.12.3.1.jar
PROJECT_ID
:您要在其中建立 Hudi BigLake 資料表的專案 IDDATASET
:您要在其中建立 Hudi BigLake 資料集的資料集LOCATION
:您要在其中建立 Hudi BigLake 資料表的位置TABLE
:要建立的資料表名稱如果您要從舊版 Hudi-BigQuery 連接器 (0.13.0 和更早版本) 遷移,該連接器會在資訊清單檔案上建立檢視區塊,請務必使用相同的資料表名稱,這樣才能保留現有的下游管道程式碼。
URI
:您建立的 Cloud Storage URI,用於儲存 Hudi 資訊清單檔案這個 URI 會指向第一層分割區,請務必加入分割區金鑰。例如
gs://mybucket/hudi/mydataset/EventDate=*
。URI_PREFIX
:Cloud Storage URI 路徑的前置字元,通常是 Hudi 資料表的路徑BASE_PATH
:Hudi 表格的基礎路徑例如
gs://mybucket/hudi/mydataset/
。PARTITION_BY
:分割區值例如
EventDate
。
如要進一步瞭解如何設定連接器,請參閱 Hudi-BigQuery 連接器。
如要設定適當的精細控制項,或啟用中繼資料快取來提升效能,請參閱「升級 BigLake 資料表」。
查詢 Delta 工作負載
現在原生支援 Delta 資料表。建議您為 Delta 工作負載建立 Delta BigLake 資料表。Delta Lake BigLake 資料表支援更進階的 Delta Lake 資料表,包括具有資料欄重新對應和刪除向量的資料表。此外,Delta BigLake 資料表會直接讀取最新快照,因此更新會立即生效。
如要查詢 Delta 工作負載,請按照下列步驟操作:
- 產生資訊清單檔案。
- 根據資訊清單檔案建立 BigLake 資料表。
- 設定適當的精細控制項,或啟用中繼資料快取來提升效能。如要執行這項操作,請參閱「升級 BigLake 資料表」。
產生資訊清單檔案
BigQuery 支援 SymLinkTextInputFormat
格式的資訊清單檔案,也就是以換行符分隔的 URI 清單。如要進一步瞭解如何產生資訊清單檔案,請參閱「設定 Presto 與 Delta Lake 的整合,並查詢 Delta 資料表」。
如要產生資訊清單檔案,請將工作提交至現有 Dataproc 叢集:
SQL
使用 Spark 在位置 path-to-delta-table
的 Delta 資料表上執行下列指令:
GENERATE symlink_format_manifest FOR TABLE delta.`<path-to-delta-table>`
Scala
使用 Spark 在位置 path-to-delta-table
的 Delta 資料表上執行下列指令:
val deltaTable = DeltaTable.forPath(<path-to-delta-table>) deltaTable.generate("symlink_format_manifest")
Java
使用 Spark 在位置 path-to-delta-table
的 Delta 資料表上執行下列指令:
DeltaTable deltaTable = DeltaTable.forPath(<path-to-delta-table>); deltaTable.generate("symlink_format_manifest");
Python
使用 Spark 在位置 path-to-delta-table
的 Delta 資料表上執行下列指令:
deltaTable = DeltaTable.forPath(<path-to-delta-table>) deltaTable.generate("symlink_format_manifest")
建立 Delta BigLake 資料表
如要建立 Delta BigLake 資料表,請使用 CREATE EXTERNAL TABLE
陳述式,並將 file_set_spec_type
欄位設為 NEW_LINE_DELIMITED_MANIFEST
:
前往「BigQuery」頁面
在查詢編輯器中執行
CREATE EXTERNAL TABLE
陳述式:CREATE EXTERNAL TABLE PROJECT_ID.DATASET_NAME.TABLE_NAME WITH PARTITION COLUMNS( `PARTITION_COLUMN PARTITION_COLUMN_TYPE`,) WITH CONNECTION `PROJECT_IDREGION.CONNECTION_NAME` OPTIONS ( format = "DATA_FORMAT", uris = ["URI"], file_set_spec_type = 'NEW_LINE_DELIMITED_MANIFEST', hive_partition_uri_prefix = "PATH_TO_DELTA_TABLE" max_staleness = STALENESS_INTERVAL, metadata_cache_mode = 'CACHE_MODE');
更改下列內容:
DATASET_NAME
:您建立的資料集名稱TABLE_NAME
:您要為這個資料表指定的名稱REGION
:連線所在位置 (例如us-east1
)CONNECTION_NAME
:您建立的連線名稱DATA_FORMAT
:任何支援的格式 (例如PARQUET
)URI
:資訊清單檔案的路徑 (例如gs://mybucket/path
)PATH_TO_DELTA_TABLE
:所有來源 URI 在分區索引鍵編碼開始前的通用前置字串STALENESS_INTERVAL
:指定對 BigLake 資料表執行的作業是否使用快取中繼資料,以及快取中繼資料必須有多新,作業才能使用。如要進一步瞭解中繼資料快取注意事項,請參閱「中繼資料快取提升效能」。如要停用中繼資料快取功能,請指定 0。這是目前的預設做法。
如要啟用中繼資料快取功能,請指定介於 30 分鐘至 7 天之間的間隔常值。舉例來說,如要指定 4 小時的過時間隔,請輸入
INTERVAL 4 HOUR
。如果資料表在過去 4 小時內重新整理過,針對資料表執行的作業就會使用快取中繼資料。如果快取中繼資料較舊,作業會改為從 Delta Lake 擷取中繼資料。CACHE_MODE
:指定中繼資料快取是否自動或手動重新整理。如要進一步瞭解中繼資料快取注意事項,請參閱「中繼資料快取提升效能」。設為
AUTOMATIC
,中繼資料快取就會以系統定義的時間間隔 (通常為 30 到 60 分鐘) 重新整理。如要依您決定的時間表重新整理中繼資料快取,請設為
MANUAL
。在這種情況下,您可以呼叫BQ.REFRESH_EXTERNAL_METADATA_CACHE
系統程序來重新整理快取。如果
STALENESS_INTERVAL
設為大於 0 的值,您就必須設定CACHE_MODE
。
範例:
CREATE EXTERNAL TABLE mydataset.mytable WITH CONNECTION `us-east1.myconnection` OPTIONS ( format="PARQUET", uris=["gs://mybucket/path/partitionpath=*"], file_set_spec_type = 'NEW_LINE_DELIMITED_MANIFEST' hive_partition_uri_prefix = "gs://mybucket/path/" max_staleness = INTERVAL 1 DAY, metadata_cache_mode = 'AUTOMATIC' );
升級 BigLake 資料表
您也可以利用中繼資料快取和具體化檢視表,提升工作負載的效能。如要使用中繼資料快取,可以同時指定相關設定。如要取得資料表詳細資料 (例如來源格式和來源 URI),請參閱「取得資料表資訊」。
如要將外部資料表更新為 BigLake 資料表,或更新現有的 BigLake,請選取下列其中一個選項:
SQL
使用 CREATE OR REPLACE EXTERNAL TABLE
DDL 陳述式更新資料表:
前往 Google Cloud 控制台的「BigQuery」頁面。
在查詢編輯器中輸入下列陳述式:
CREATE OR REPLACE EXTERNAL TABLE `PROJECT_ID.DATASET.EXTERNAL_TABLE_NAME` WITH CONNECTION {`REGION.CONNECTION_ID` | DEFAULT} OPTIONS( format ="TABLE_FORMAT", uris = ['BUCKET_PATH'], max_staleness = STALENESS_INTERVAL, metadata_cache_mode = 'CACHE_MODE' );
取代下列項目:
PROJECT_ID
:包含資料表的專案名稱DATASET
:包含資料表的資料集名稱EXTERNAL_TABLE_NAME
:資料表名稱REGION
:包含連線的區域CONNECTION_ID
:要使用的連線名稱如要使用 預設連線,請指定
DEFAULT
,而非包含REGION.CONNECTION_ID
的連線字串。TABLE_FORMAT
:資料表使用的格式更新資料表時無法變更這項設定。
BUCKET_PATH
:Cloud Storage 值區的路徑,其中包含外部資料表的資料,格式為['gs://bucket_name/[folder_name/]file_name']
。如要在路徑中指定一個星號 (
*
) 萬用字元,即可從值區選取多個檔案。例如,['gs://mybucket/file_name*']
。詳情請參閱「Cloud Storage URI 的萬用字元支援」。如要為
uris
選項指定多個值區,請提供多個路徑。以下範例顯示有效的
uris
值:['gs://bucket/path1/myfile.csv']
['gs://bucket/path1/*.csv']
['gs://bucket/path1/*', 'gs://bucket/path2/file00*']
指定以多個檔案為目標的
uris
值時,所有檔案都必須共用相容的結構定義。如要進一步瞭解如何在 BigQuery 中使用 Cloud Storage URI,請參閱「Cloud Storage 資源路徑」。
STALENESS_INTERVAL
:指定對資料表執行的作業是否使用快取中繼資料,以及快取中繼資料必須有多新,作業才能使用如要進一步瞭解中繼資料快取注意事項,請參閱「中繼資料快取提升效能」。
如要停用中繼資料快取功能,請指定 0。這是目前的預設做法。
如要啟用中繼資料快取功能,請指定介於 30 分鐘至 7 天之間的間隔常值。舉例來說,如要指定 4 小時的過時間隔,請輸入
INTERVAL 4 HOUR
。如果資料表在過去 4 小時內重新整理過,針對資料表執行的作業就會使用快取中繼資料。如果快取中繼資料的建立時間早於該時間,作業會改為從 Cloud Storage 擷取中繼資料。CACHE_MODE
:指定中繼資料快取是否自動或手動重新整理如要進一步瞭解中繼資料快取注意事項,請參閱「中繼資料快取提升效能」。
設為
AUTOMATIC
,中繼資料快取就會以系統定義的時間間隔 (通常為 30 到 60 分鐘) 重新整理。如要依您決定的時間表重新整理中繼資料快取,請設為
MANUAL
。在這種情況下,您可以呼叫BQ.REFRESH_EXTERNAL_METADATA_CACHE
系統程序來重新整理快取。如果
STALENESS_INTERVAL
設為大於 0 的值,您就必須設定CACHE_MODE
。
按一下「執行」
。
如要進一步瞭解如何執行查詢,請參閱「執行互動式查詢」。
bq
使用 bq mkdef
和 bq update
指令更新資料表:
產生外部資料表定義,說明要變更的資料表層面:
bq mkdef --connection_id=PROJECT_ID.REGION.CONNECTION_ID \ --source_format=TABLE_FORMAT \ --metadata_cache_mode=CACHE_MODE \ "BUCKET_PATH" > /tmp/DEFINITION_FILE
更改下列內容:
PROJECT_ID
:包含連線的專案名稱REGION
:包含連線的區域CONNECTION_ID
:要使用的連線名稱TABLE_FORMAT
:資料表使用的格式。更新資料表時無法變更這項設定。CACHE_MODE
:指定中繼資料快取是否自動或手動重新整理。如要進一步瞭解中繼資料快取考量事項,請參閱「中繼資料快取提升效能」一文。設為
AUTOMATIC
,中繼資料快取就會以系統定義的時間間隔重新整理,通常介於 30 到 60 分鐘之間。如要依您決定的時間表重新整理中繼資料快取,請設為
MANUAL
。在這種情況下,您可以呼叫BQ.REFRESH_EXTERNAL_METADATA_CACHE
系統程序來重新整理快取。如果
STALENESS_INTERVAL
設為大於 0 的值,您就必須設定CACHE_MODE
。BUCKET_PATH
:包含外部資料表資料的 Cloud Storage bucket 路徑,格式為gs://bucket_name/[folder_name/]file_name
。如要在路徑中指定一個星號 (
*
) 萬用字元,即可限制從值區選取的檔案。例如,gs://mybucket/file_name*
。詳情請參閱「Cloud Storage URI 的萬用字元支援」。如要為
uris
選項指定多個值區,請提供多個路徑。以下範例顯示有效的
uris
值:gs://bucket/path1/myfile.csv
gs://bucket/path1/*.csv
gs://bucket/path1/*,gs://bucket/path2/file00*
指定以多個檔案為目標的
uris
值時,所有檔案都必須共用相容的結構定義。如要進一步瞭解如何在 BigQuery 中使用 Cloud Storage URI,請參閱「Cloud Storage 資源路徑」。
DEFINITION_FILE
:您要建立的資料表定義檔名稱。
使用新的外部資料表定義更新資料表:
bq update --max_staleness=STALENESS_INTERVAL \ --external_table_definition=/tmp/DEFINITION_FILE \ PROJECT_ID:DATASET.EXTERNAL_TABLE_NAME
更改下列內容:
STALENESS_INTERVAL
:指定對資料表執行的作業是否使用快取中繼資料,以及快取中繼資料必須有多新,作業才能使用。如要進一步瞭解中繼資料快取注意事項,請參閱「中繼資料快取提升效能」。如要停用中繼資料快取功能,請指定 0。這是目前的預設做法。
如要啟用中繼資料快取,請使用
INTERVAL
資料類型文件所述的Y-M D H:M:S
格式,指定 30 分鐘到 7 天之間的間隔值。舉例來說,如要指定 4 小時的過時間隔,請輸入0-0 0 4:0:0
。如果資料表在過去 4 小時內重新整理過,針對資料表執行的作業就會使用快取中繼資料。如果快取中繼資料較舊,作業會改為從 Cloud Storage 擷取中繼資料。DEFINITION_FILE
:您建立或更新的資料表定義檔案名稱。PROJECT_ID
:包含資料表的專案名稱DATASET
:包含資料表的資料集名稱EXTERNAL_TABLE_NAME
:資料表名稱
查詢 BigLake 和外部資料表
建立 BigLake 資料表後,您可以使用 GoogleSQL 語法查詢資料表,就像查詢標準 BigQuery 資料表一樣。例如:SELECT field1, field2 FROM mydataset.my_cloud_storage_table;
。
限制
BigQuery 僅支援查詢 Delta Lake 讀取器第 1 版資料表。
Hudi 和 BigQuery 整合功能僅適用於 Hive 樣式的分區
copy-on-write
資料表。
後續步驟
- 瞭解如何在 BigQuery 中使用 SQL。
- 瞭解 BigLake 資料表。
- 瞭解 BigQuery 配額。