使用資訊清單查詢開放式資料表格式
BigQuery 可讓您使用資訊清單檔案,查詢及載入以開放資料表格式 (例如 Apache Hudi 和 Delta Lake) 儲存的資料。開放式資料表格式會將目前狀態匯出為一或多個資訊清單檔案,列出資料表中的資料檔案,讓您在 BigQuery 中分析這些資料表,而不必複製資料。
事前準備
啟用 BigQuery Connection、BigQuery Reservation 和 BigLake API (如果尚未啟用)。
啟用 API 所需的角色
您必須具備
serviceusage.services.enable權限,才能啟用 API。如果您建立了專案,可能已透過「擁有者」角色 (roles/owner) 取得這項權限。否則,您可以透過「Service Usage 管理員」角色 (roles/serviceusage.serviceUsageAdmin) 取得這項權限。瞭解如何授予角色。如要建立 BigLake 資料表,請使用下列任一方法執行 Spark 指令:
建立 Managed Service for Apache Spark 叢集。如要查詢 Hudi 資料表,請將
--optional-components欄位設為HUDI。如要查詢 Delta 資料表,請將--optional-components設為Presto。在 BigQuery 中使用 Spark 預存程序。請按照以下步驟操作:
如要將資訊清單檔案儲存在 Cloud Storage,請建立 Cloud Storage bucket。您必須連線至 Cloud Storage bucket,才能存取資訊清單檔案。請按照以下步驟操作:
必要的角色
如要查詢以 Hudi 和 Delta Lake 資料為基礎的 BigLake 資料表,請確認您具備下列角色:
- BigQuery 連線使用者 (
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 資料表所需的確切權限,請展開「Required permissions」(必要權限) 部分:
所需權限
bigquery.connections.usebigquery.jobs.createbigquery.readsessions.create(只有在使用 BigQuery Storage Read API 讀取資料時才需要)bigquery.tables.getbigquery.tables.getData
查詢 Hudi 工作負載
如要查詢 Hudi 資料,請按照下列步驟操作:
- 根據 Hudi 資料建立外部資料表。
- 將外部資料表升級為 BigLake。
建立 Hudi 外部資料表
使用 Hudi 和 BigQuery 的同步工具同步資料表時,請啟用 use-bq-manifest-file 旗標,轉換為資訊清單檔案方法。這個旗標也會以 BigQuery 支援的格式匯出資訊清單檔案,並使用該檔案建立外部資料表,名稱則為 --table 參數中指定的名稱。
如要建立 Hudi 外部資料表,請按照下列步驟操作:
如要建立 Hudi 外部資料表,請提交工作至現有的 Managed Service for Apache Spark 叢集。建構 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。如果您在 Managed Service for Apache Spark 2.1 中使用 Hudi 元件,請指定/usr/lib/hudi/tools/bq-sync-tool/hudi-gcp-bundle-0.12.3.1.jarPROJECT_ID:要建立 Hudi BigLake 資料表的專案 IDDATASET:要在其中建立 Hudi BigLake 資料表的資料集LOCATION:要建立 Hudi BigLake 資料表的位置TABLE:要建立的資料表名稱如果您是從舊版 Hudi-BigQuery 連接器 (0.13.0 以下版本) 轉換,且該連接器會在資訊清單檔案上建立檢視表,請務必使用相同的資料表名稱,以便保留現有的下游管道程式碼。
URI:您建立用來儲存 Hudi 資訊清單檔案的 Cloud Storage URI這個 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 資料表」。
如要產生資訊清單檔案,請將工作提交至現有的 Managed Service for Apache Spark 叢集:
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 資料表
您也可以利用中繼資料快取和materialized view,加快工作負載的執行速度。如要使用中繼資料快取,可以同時指定相關設定。如要取得資料表詳細資料 (例如來源格式和來源 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 bucket 的路徑,其中包含外部資料表的資料,格式為['gs://bucket_name/[folder_name/]file_name']。您可以在路徑中指定一個星號 (
*) 萬用字元,從 bucket 中選取多個檔案。例如,['gs://mybucket/file_name*']。詳情請參閱「Cloud Storage URI 的萬用字元支援」。您可以提供多個路徑,為
uris選項指定多個 bucket。以下範例顯示有效的
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。您可以在路徑中指定一個星號 (
*) 萬用字元,限制從 bucket 中選取的檔案。例如,gs://mybucket/file_name*。詳情請參閱「Cloud Storage URI 的萬用字元支援」。您可以提供多個路徑,為
uris選項指定多個 bucket。以下範例顯示有效的
uris值:gs://bucket/path1/myfile.csvgs://bucket/path1/*.csvgs://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 讀取器 v1 資料表。
Hudi 和 BigQuery 整合功能僅適用於 Hive 樣式的分區
copy-on-write資料表。
後續步驟
- 瞭解如何在 BigQuery 中使用 SQL。
- 瞭解 BigLake 資料表。
- 瞭解 BigQuery 配額。