在專用 Exadata 基礎架構上使用 Autonomous Database 查詢 Apache Iceberg 表格
Autonomous Database 支援查詢 Apache Iceberg 表格。
附註:
從 19.28 版開始,Oracle Database 19c 以及從 23.9 版開始的 Oracle Database 23ai 中,支援查詢 Apache Iceberg 表格。支援的組態
- Amazon Web Services AWS 上的 Iceberg 表格:
- 在 AWS Glue Data Catalog 註冊的 Iceberg 表格,使用 Spark 或 Athena 建立。
如需詳細資訊,請參閱使用 AWS Glue 連接器來讀取和寫入含有 ACID 交易的 Apache Iceberg 表格,並執行時間旅行和使用 Iceberg 表格。
- 透過直接提供根中繼資料檔案的 URL,儲存在 AWS S3 上的 Iceberg 表格。
- 在 AWS Glue Data Catalog 註冊的 Iceberg 表格,使用 Spark 或 Athena 建立。
- Oracle Cloud Infrastructure (OCI) Object Storage 上的 Iceberg 表格:
- 使用 Hadoop 目錄產生 OCI 資料流程的 Iceberg 表格。
如需詳細資訊,請參閱 Oracle 資料流程範例和使用 Hadoop 目錄。
- 透過直接提供根中繼資料檔案的 URL,儲存在 OCI Object Storage 中的 Iceberg 表格。
- 使用 Hadoop 目錄產生 OCI 資料流程的 Iceberg 表格。
限制
- 分割的 Iceberg 表格
Oracle 不支援 Iceberg 分割表格。
- Iceberg 表格的資料列層次更新
Oracle 不支援 Iceberg 表格更新的合併讀取。在 Iceberg 中繼資料中遇到已刪除檔案的查詢將會失敗 。如需有關合併讀取的詳細資訊,請參閱列舉 RowLevelOperationMode 。
- 綱要發展
Oracle 外部表格的綱要是固定的,並且反映在建立外部表格時所使用的 Iceberg 綱要版本。與用來建立 Iceberg 表格的版本相比,如果 Iceberg 中繼資料指向不同的架構版本,則查詢會失敗 。如果 Iceberg 架構在建立外部表格之後發生變更,建議重新建立外部表格。
查詢 Apache Iceberg 表格的相關概念
對下列概念的理解有助於查詢 Apache Iceberg 表格。
Iceberg 目錄
Iceberg 目錄是管理表格中繼資料的服務,如表格快照、 表格機制和分割資訊 。為了查詢 Iceberg 表格的最新快照,查詢引擎必須先存取目錄 ,並取得最新的中繼資料檔案的位置 。已經有許多可用的目錄導入,包括 AWS Glue、Hive、Nessie 和 Hadoop。Autonomous Database 支援 AWS Glue 目錄,以及 Spark 使用的 HadoopCatalog 實作。
如需詳細資訊,請參閱 Optimistic Concurrency 。
中繼資料的檔案
中繼資料檔案是 JSON 文件,可追蹤表格快照、分割配置和結構描述資訊。中繼資料檔案是資訊清單清單與資訊清單檔案階層的進入點。清單會追蹤表格的資料檔,以及包括分割與資料欄統計資料的資訊。如需詳細資訊,請參閱 Iceberg 表格規格。
交易
Iceberg 支援使用寫入時複製或讀取時合併之表格的列層級更新。寫入時複製會產生反映更新之資料列的新資料檔,而讀取時合併會產生新的「刪除檔案」,此檔案必須在讀取期間與資料檔合併。Oracle 支援寫入時複製。如果 iceberg 表格遇到刪除檔案,則查詢會失敗。如需詳細資訊,請參閱 RowLevelOperationMode 。
綱要發展
Iceberg 支援架構演進 。綱要變更會使用綱要 ID 反映在 Iceberg 描述資料中。請注意,Oracle 外部表格有一個固定的綱要,由表格建立時最新的綱要版本決定。當查詢的中繼資料與表格建立時所使用的綱要版本相較之下,Iceberg 查詢失敗。如需詳細資訊,請參閱綱要演進。
分割
Iceberg 支援進階分割選項,例如隱藏的分割和分割區演進,這些選項仰賴處理 / 更改表格的中繼資料,而無須進行昂貴的資料配置變更。
範例:查詢 Apache Iceberg 表格
這些範例顯示如何使用資料目錄,並使用根資訊清單檔案的直接 URL 查詢 Amazon Web Services (AWS) 和 Oracle Cloud Infrastructure (OCI) 上的 Apache Iceberg 表格。
如需為 Apache Iceberg 建立外部表格的詳細資訊,請參閱 Apache Iceberg 的 CREATE_EXTERNAL_TABLE 程序。
使用 Glue 資料目錄查詢 AWS 上的 Iceberg 表格
在此範例中,我們查詢 Iceberg 表格 iceberg_parquet_time_dim
.
example_1_table.png 圖解描述
表格屬於 Glue 資料庫 my-iceberg-db
,並儲存在資料夾 s3://my-iceberg-bucket/iceberg-loc
中。
此處顯示 iceberg_parquet_time_dim
的表格詳細資訊:

example_1_details_v1.png 圖解描述
我們可以建立 iceberg_parquet_time_dim
的外部表格,如下所示:
BEGIN
DBMS_CLOUD.CREATE_EXTERNAL_TABLE (
table_name => 'iceberg_parquet_time_dim',
credential_name => 'AWS_CRED',
file_uri_list => '',
format =>
'{"access_protocol":
{
"protocol_type": "iceberg",
"protocol_config":
{
"iceberg_catalog_type": "aws_glue",
"iceberg_glue_region": "us-west-1",
"iceberg_table_path": "my-iceberg-db.iceberg_parquet_time_dim"
}
}
}'
);
END;
/
在 protocol_config 區段中,我們指定表格使用 AWS Glue 作為目錄類型,並將目錄的區域設為 us-west-1
。
證明資料 AWS_CRED
是使用 dbms_cloud.create_credential
與 AWS API 金鑰建立。由於每個帳戶都有單一 Glue 資料目錄區域,因此 Glue 資料目錄實例是由與 AWS_CRED
區域 us-west-1
相關聯的帳戶 ID 決定。protocol_config
區段中的 iceberg_table_path
元素使用 $database_name.$table_name
路徑來指定 Glue 表格名稱和資料庫名稱。最後,column_list
和 field_list
參數會保留為空值,因為表格的綱要是從 Iceberg 中繼資料自動衍生而來。
如需建立證明資料的進一步資訊,請參閱 CREATE_CREDENTIAL Procedure 。
如需 AWS Glue 資源的相關資訊,請參閱指定 AWS Glue 資源 ARN 。
使用根中繼資料檔案的位置查詢 AWS 上的 Iceberg 表格
如果我們知道 Iceberg 表格的中繼資料檔案位置,我們可以建立外部表格而不需要指定目錄,如下所示:
BEGIN
DBMS_CLOUD.CREATE_EXTERNAL_TABLE (
table_name => 'iceberg_parquet_time_dim',
credential_name => 'AWS_CRED',
file_uri_list => 'https://my-iceberg-bucket.s3.us-west-1.amazonaws.com/iceberg-loc/metadata/00004-1758ee2d-a204-4fd9-8d52-d17e5371a5ce.metadata.json',
format =>'{"access_protocol":{"protocol_type":"iceberg"}}');
END;
/
我們使用 file_uri_list
參數,以 AWS S3 虛擬代管樣式 URL 格式指定中繼資料檔案的位置。如需此格式的資訊,請參閱存取 AWS S3 儲存桶的方法。
在此範例中,資料庫會直接存取中繼資料檔案,因此不需要在 format
參數中提供 protocol_config
區段。使用描述資料檔案位置建立外部表格時,資料庫會查詢描述資料檔案所參照的最新快照。隨後更新的 Iceberg 表格 (建立新快照和新中繼資料檔案) 將不會顯示於資料庫中。
查詢在 OCI 上使用 Hadoop 目錄的 Iceberg 表格
在此範例中,我們查詢使用 OCI Data Flow 建立的 Iceberg 表格 icebergTablePy
,其中 Spark 會在 Iceberg 目錄中使用 HadoopCatalog 實作。HadoopCatalog 使用 warehouse
目錄,並將 Iceberg 中繼資料放在此目錄下的 $database_name/$table_name
子資料夾中。它也使用 version-hint.text
檔案,其中包含最新描述資料檔案版本的版本號碼。請參閱 OCI 資料流程的 Iceberg 支援,瞭解 Github 上的範例。
範例表格 db.icebergTablePy
是使用 warehouse
資料夾 (名稱為 iceberg
) 在 OCI 儲存桶 my-iceberg-bucket
中建立的。OCI 上表格 icebergTablePy
的儲存體配置如下所示:

example_3_table_v1.png 圖解描述
建立表格 db.icebergTablePy
的外部表格,如下所示:
BEGIN
DBMS_CLOUD.CREATE_EXTERNAL_TABLE (
table_name => 'iceberg_parquet_time_dim3',
credential_name => 'OCI_CRED',
file_uri_list => '',
format =>'{"access_protocol":{"protocol_type":"iceberg",
"protocol_config":{"iceberg_catalog_type": "hadoop",
"iceberg_warehouse":"https://objectstorage.uk-cardiff-1.oraclecloud.com/n/my-tenancy/b/my-iceberg-bucket/o/iceberg",
"iceberg_table_path": "db.icebergTablePy"}}}');
END;
/
使用根中繼資料檔案的位置查詢 OCI 上的 Iceberg 表格
我們可以直接使用中繼資料檔案的 URL 來查詢上一節所述的 Iceberg 表格,如下所示:
BEGIN
DBMS_CLOUD.CREATE_EXTERNAL_TABLE (
table_name => 'iceberg_parquet_time_dim4',
credential_name => 'OCI_CRED',
file_uri_list => 'https://objectstorage.uk-cardiff-1.oraclecloud.com/n/my-tenancy/b/my-iceberg-bucket/o/iceberg/db/icebergTablePy/metadata/v2.metadata.json',
format =>'{"access_protocol":{"protocol_type":"iceberg"}}'
);
END;
/
在此範例中,我們使用 file_uri_list
參數,以原生 OCI URI 格式指定中繼資料檔案的 URI。使用描述資料檔案 URI 時,外部表格一律會查詢儲存在特定檔案中的最新快照。查詢無法存取產生新快照和新描述資料檔案的後續更新。
如需原生 OCI URI 格式的詳細資訊,請參閱雲端物件儲存 URI 格式。