在專用 Exadata 基礎架構上使用 Autonomous Database 查詢 Apache Iceberg 表格

Autonomous Database 支援查詢 Apache Iceberg 表格。

附註:

從 19.28 版開始,Oracle Database 19c 以及從 23.9 版開始的 Oracle Database 23ai 中,支援查詢 Apache 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 的描述如下
example_1_table.png 圖解描述

表格屬於 Glue 資料庫 my-iceberg-db,並儲存在資料夾 s3://my-iceberg-bucket/iceberg-loc 中。

此處顯示 iceberg_parquet_time_dim 的表格詳細資訊:

example_1_details_v1.png 的描述如下
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 的描述如下
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 格式