Apache Iceberg表の問合せ
Autonomous Databaseは、「Apache Iceberg」表の問合せをサポートします。
Apache Iceberg表の問合せについて
Autonomous Databaseでは、Apache Iceberg表の問合せがサポートされています。
サポートされる構成
サポートされている構成の互換性マトリックスを次に示します。
| カタログ | オブジェクト・ストア | カタログ承認(REST) | ストレージ認証 | ノート |
|---|---|---|---|---|
| Unity(データブリック) | Amazon S3、Azure ADLS Gen2 | OAuth2サービス・プリンシパル(/oidc/v1/token) - 推奨、PAT - クイック・テスト | S3アクセス/シークレット・キー、ADLS Gen2 SASキー |
|
| Polaris (Snowflake) | Amazon S3、Azure ADLS Gen2 | OAuth2 (クライアント資格証明)またはPolarisでサポートされているトークン | S3アクセス/シークレット・キー、ADLS Gen2 SASキー | オブジェクト・ストア資格証明の自動販売はサポートされていません。 |
| AWS Glue | Amazon S3 | 該当なし(AWSアカウント認証を使用) | S3アクセス/秘密鍵。 | オブジェクト・ストア資格証明の自動販売はサポートされていません。 S3およびGlueには同じ資格証明を使用する必要があります。 S3とGlueは同じAWSリージョンに存在する必要があります。 |
| JSONメタデータ(カタログ外オプション) | Amazon S3、Azure ADLS Gen2、OCI Object Store | 該当なし(RESTなし) | S3アクセス/シークレット・キー、ADLS Gen2 SASキー、OCIネイティブ資格証明 | ADBをテーブルのmetadata.json (ルート・マニフェスト)にポイントします。 Point-in-Timeスナップショット。スキーマ変更または新規スナップショット後に外部表を再作成します。
|
| Hadoop (カタログ外) | OCIオブジェクト・ストレージ | 該当なし(RESTなし) | OCIネイティブ資格証明 | データおよびメタデータ・ファイルを含むウェアハウス・フォルダを指します。 |
Apache Iceberg表の問合せの制限事項
この章では、Apache Iceberg表の問合せの制限事項を示します。
-
Unity Native Iceberg(REST): サポートされていません。
回避策: Delta + UniFormを使用して、Unity CatalogのIceberg RESTエンドポイントを介してIceberg読取り可能なビューを公開します。
- 動作保証されたRESTカタログ: ADBは、Iceberg読取りアクセス用のSnowflake PolarisおよびDatabricks Unity Catalog (UniFormのみ)で動作保証されています。
-
カタログ資格証明の自動販売: サポートされません。
自動ロール仮定やSTSによって発行された一時資格証明など、クラウドネイティブのロールベースの自動販売はサポートされていません。 明示的なアクセス/秘密鍵または静的トークンを使用します。)
- AWS ARN資格証明: サポートされません。 IAMロールARNおよびARN経由のAssumeRoleは受け入れられません。
- パーティション化されたIceberg表はサポートされていません。非パーティション表のみが許可されます。
- 行レベルの更新(読取りマージ):サポートされません。 Icebergメタデータがファイルの削除を参照している場合、問合せは失敗します。
- 固定外部表のスキーマは作成時に決定され、メタデータのIcebergスキーマ・バージョンと一致する必要があります。 Icebergスキーマが更新された場合は、外部表を再作成する必要があります。
- 問合せ時間移動なし:スナップショット、バージョンまたはタイムスタンプによる問合せはサポートされていません。
- Non_catalogのみ:新しいスナップショットは自動的に選択されません。 特定のスナップショットを読み取るには、そのスナップショットのmetadata.jsonをターゲットにし、外部表を再作成します。
- 資格証明の位置合せ: AWS S3およびAWS Glueに同じ資格証明を使用する必要があります。
- リージョンの共同配置: S3バケットとAWS Glueカタログは同じAWSリージョンにある必要があります。
Apache Iceberg表の問合せに関連する概念
次の概念を理解しておくと、「Apache Iceberg」表の問合せに役立ちます。
Icebergカタログ
Icebergカタログは、表メタデータ(表スナップショット、表スキーマおよびパーティション化情報など)を管理するサービスです。 Iceberg表の最新のスナップショットを問い合せるには、問合せエンジンが最初にカタログにアクセスし、最新のメタデータ・ファイルのロケーションを取得する必要があります。 AWS Glue、Hive、Nessie、Hadoopなど、利用可能なカタログ実装はすでに数多くあります。 Autonomous Databaseは、Sparkで使用されるAWS GlueカタログおよびHadoopCatalog実装をサポートしています。
詳細は、「オプティミスティック同時実行性」を参照してください。
メタデータ・ファイル
メタデータ・ファイルは、表のスナップショット、パーティション化スキームおよびスキーマ情報を追跡するJSONドキュメントです。 メタデータ・ファイルは、マニフェスト・リストとマニフェスト・ファイルの階層へのエントリ・ポイントです。 マニフェストは、表のデータファイル、およびパーティション分割やカラム統計などの情報を追跡します。 詳細は、「Iceberg表仕様」を参照してください。
トランザクション
Icebergは、copy-on-writeまたはmerge-on-readを使用した表に対する行レベルの更新をサポートしています。 Copy-on-writeは、更新された行を反映する新しいデータ・ファイルを生成し、merge-on-readは、読取り中にデータ・ファイルとマージする必要がある新しいdeleteファイルを生成します。 Oracleでは、コピー・オン・ライトがサポートされています。 iceberg表に対する問合せは、削除ファイルが検出されると失敗します。 詳細は、RowLevelOperationModeを参照してください。
スキーマ進化
Icebergはスキーマの進化をサポートしています。 スキーマの変更は、スキーマIDを使用してIcebergメタデータに反映されます。 Oracle外部表には、表の作成時に最新のスキーマ・バージョンによって決定される固定スキーマがあります。 Iceberg問合せは、問合せされたメタデータが表作成時に使用されたものとは異なるスキーマ・バージョンを指している場合に失敗します。 詳細は、「スキーマ進化」を参照してください。
パーティショニング
Icebergは、高コストのデータ・レイアウトを変更することなく、表のメタデータの処理/変更に依存する、非表示のパーティション化やパーティションの進化などの高度なパーティション化オプションをサポートしています。
Icebergの資格証明: RESTカタログとオブジェクト・ストア
このトピックでは、Apache Icebergが、RESTカタログとオブジェクト・ストアの2つの資格証明を使用してデータを管理およびアクセスする方法について説明します。 また、Apache Icebergなどのデータ・レイク表形式で表情報を管理する2つの異なる方法を参照することもできます。
カタログ管理表とダイレクト・メタデータの外部表
次の項では、カタログ管理の外部表をダイレクト・メタデータ外部表と比較し、主な違いを強調表示します。
-
カタログ管理(Unity/Polaris/AWS Glue)
内容: RESTカタログを介して解決されるメタデータ、スキーマおよび現在のスナップショット。
動作:カタログの最新のスナップショット(集中管理された権限、タグおよび系統)を自動的に反映します。
最適:エンタープライズ・データ製品、クロスエンジンの共有、一貫したガバナンス、発見性(カタログは信頼できる唯一のポイントです)。
-
-
ダイレクト・メタデータ(
metadata.jsonを介したファイル・システム)内容:外部表は、特定の
metadata.jsonを直接指します。動作:修正された再現可能なスナップショット。自動的には進歩せず、ガバナンスはオブジェクト・ストアACLに限定されます。
最適:実験、テスト、監査。
-
RESTとオブジェクト・ストアの資格証明
RESTカタログ資格証明
Apache Iceberg RESTカタログに接続する場合は、REST資格証明が必要です。 RESTカタログは、RESTfulエンドポイントを公開して、Iceberg表のメタデータを管理します。 認証には、多くの場合、REST資格証明はOAuthベースであるため、client IDおよびsecretを使用してトークン・エンドポイントからベアラー・トークンを取得する必要があります。
-
rest_auth_cred: カタログ・サービス(UnityやPolarisなど)で認証します。 credential_name: Icebergのデータおよびメタデータが存在するオブジェクト・ストアに対して認証します。
ノート:
現時点では、資格証明の販売はサポートされていません。 資格証明の自動送信とは、アクセス資格証明(ユーザー名とパスワード、APIキー、トークンなど)が必要になったときに、構成ファイルまたはスクリプトに静的に格納するのではなく、多くの場合、自動またはオンデマンドで配布またはフェッチする制御されたプロセスを指します。オブジェクト・ストア資格証明
オブジェクト・ストア資格証明は、Apache Iceberg表がOracle Cloud Infrastructure (OCI) Object StorageやAmazon S3などのクラウド・オブジェクト・ストレージに直接格納されている場合に使用されます。
資格証明により、Autonomous Databaseは、クラウド・オブジェクト・ストアから直接ファイル(Parquetデータやメタデータ・マニフェストなど)にアクセスして読み取ることができます。
ノート:
OCI/S3バケット内のParquet/メタデータ・ファイルを直接指す外部表を定義する場合は、オブジェクト・ストア資格証明を使用します。Apache Iceberg表の問合せの一般的なワークフロー
Apache Iceberg表の問合せを開始する前に、ワークフローに精通している必要があります。 この項では、5つの主なステップを持つエンドツーエンドの設定ワークフローとして表示されるデータにアクセスするための外部表の設定方法について説明します。
- アクセス・モデルの決定:
- カタログ管理: このモデルは、継続的に更新され、管理されたカタログをデータ・メタデータの信頼できる唯一の情報源として機能させる場合に使用します。 この中央カタログは、データの一貫性とガバナンスを維持するのに役立ちます。
- ダイレクト・メタデータ: このモデルは、メタデータの固定スナップショット(metadata.json経由)を操作する場合に使用します。 このモデルは、よりシンプルですが静的で、自動更新やガバナンスがないため、本番環境にはお薦めしません。
- 必要なものの収集:
- カタログ管理: カタログ・エンドポイント(該当する場合)、正確な表パスおよび実際のデータ・ファイルが存在するオブジェクト・ストアの場所にアクセスできる必要があります。
- ダイレクト・メタデータ: ルート
metadata.jsonファイルを指すURIと、これらのデータ・ファイルのオブジェクト・ストアの場所のみが必要です。
- 資格証明の準備:
- 「カタログ管理」設定の場合は、カタログにアクセスするための資格証明を取得します。
- データ・ファイルとメタデータ・ファイルの両方を読み取るモデルに関係なく、オブジェクト・ストア資格証明は常に必要です。
ノート:
自動資格証明の自動販売およびカタログ・アクセス用のAWS AssumeRoleはサポートされていません。
- 外部表の作成:
- 「カタログ管理」では、表はカタログを介してデータを問い合せ、オブジェクト・ストア内のファイルにアクセスします。
- Direct-Metadataでは、表はカタログに関係することなく、特定の
metadata.jsonファイルを直接指します。
-
クイック・チェックと期待事項:
COUNT(*)などの単純な問合せを実行して、表の設定を確認し、データに正しくアクセスできることを確認します。
プロバイダのクイックスタート
この章では、様々なクラウド・データ・プロバイダで外部データ・アクセスを設定するプロセスについて説明します。
トピック:
Databricks Unityカタログ
この項では、DatabricksをUniFormを介してオープン・テーブル・フォーマットにリンクするワークフローについて説明し、Icebergをサポートする環境でのDelta Lakeデータへのアクセスを容易にします。
Databricks Unityカタログ(UniFormパス)
- Icebergクライアントが読み取ることができるように、UniFormで作成されたDeltaテーブル。
- Azure ADLS Gen2またはAWS S3の表ファイル。
- 外部アクセス用のUnityカタログ権限(外部データ・アクセスの有効化など)。プリンシパルに
EXTERNAL USE SCHEMAを付与します。 - 認証: OAuth2 (推奨)または個人アクセス・トークン(クイック・テスト用)。
ノート:
Iceberg REST経由のネイティブIcebergは、当社の統合によってまだサポートされていません。 Delta with UniForm (Iceberg-readable)を使用し、Unity Iceberg REST (https://<workspace-host>/api/2.1/unity-catalog/iceberg)を介して公開します。
データブリックにUniForm (アイスバーグ読取り可能)表を作成します:
customers_icebergという名前のUniForm (アイスバーグ読取り可能)表を作成します。USE CATALOG <your_catalog>;
USE SCHEMA <your_schema>;
CREATE TABLE customers_iceberg (
id INT,
name STRING
)
TBLPROPERTIES(
'delta.columnMapping.mode'='name',
'delta.enableIcebergCompatV2'='true',
'delta.universalFormat.enabledFormats'='iceberg'
);
INSERT INTO customers_iceberg (id, name) VALUES
(1,'Alice'), (2,'Bob'), (3,'Carol');オブジェクト・ストア資格証明(ADLS Gen2)
BEGIN
BEGIN DBMS_CLOUD.DROP_CREDENTIAL('AZURE_BLOB_CRED'); EXCEPTION WHEN OTHERS THEN NULL; END;
DBMS_CLOUD.CREATE_CREDENTIAL(
credential_name => 'AZURE_BLOB_CRED',
username => '<storage-account-or-sas-username>',
password => '<storage-key-or-sas-token>'
);
END;
/OAuth2を使用したRESTカタログ資格証明の作成
-- Databricks service principal (client_id / client_secret)
BEGIN
BEGIN DBMS_CLOUD.DROP_CREDENTIAL('UNITY_OAUTH'); EXCEPTION WHEN OTHERS THEN NULL; END;
DBMS_CLOUD.CREATE_CREDENTIAL(
credential_name => 'UNITY_OAUTH',
username => '<client_id>',
password => '<client_secret>'
);
END;
/
BEGIN
DBMS_CLOUD.CREATE_EXTERNAL_TABLE(
table_name => 'CUSTOMERS_ICEBERG',
credential_name => 'AZURE_BLOB_CRED',
format => '{
"access_protocol": {
"protocol_type": "iceberg-rest",
"protocol_config": {
"iceberg_catalog_type": "unity",
"rest_catalog_endpoint": "https://<workspace-host>/api/2.1/unity-catalog/iceberg",
"rest_authentication": {
"rest_auth_cred": "UNITY_OAUTH",
"rest_auth_endpoint": "https://<workspace-host>/oidc/v1/token"
},
"table_path": ["<your_catalog>","<your_schema>","customers_iceberg"]
}
}
}'
);
END;
/
SELECT COUNT(*) FROM CUSTOMERS_ICEBERG;個人アクセス・トークン(PAT)を使用したRESTカタログ資格証明の作成
BEGIN
BEGIN DBMS_CLOUD.DROP_CREDENTIAL('UNITY_PAT'); EXCEPTION WHEN OTHERS THEN NULL; END;
DBMS_CLOUD.CREATE_CREDENTIAL(
credential_name => 'UNITY_PAT',
username => 'token',
password => '<dapiXXXXXXXXXXXXXXXXXXXXXXXX>'
);
END;
/
BEGIN
DBMS_CLOUD.CREATE_EXTERNAL_TABLE(
table_name => 'CUSTOMERS_ICEBERG',
credential_name => 'AZURE_BLOB_CRED',
format => '{
"access_protocol": {
"protocol_type": "iceberg-rest",
"protocol_config": {
"iceberg_catalog_type": "unity",
"rest_catalog_endpoint": "https://<workspace-host>/api/2.1/unity-catalog/iceberg",
"rest_authentication": { "rest_auth_cred": "UNITY_PAT" },
"table_path": ["<your_catalog>","<your_schema>","customers_iceberg"]
}
}
}'
);
END;
/
SELECT COUNT(*) FROM CUSTOMERS_ICEBERG;
Snowflake Polaris
このトピックでは、OAuth2認証を使用してREST APIを介してApache Polaris Iceberg表へのセキュア・アクセスを許可するSnowflake Polaris (RESTカタログ)について説明します。
Snowflake Polaris (RESTカタログ)
- Polaris Icebergのカタログとエンドポイントがアカウントで利用可能です。
- オブジェクト・ストアでアクセス可能な表ファイル(該当する場合はS3/ADLS)。
- 認証: OAuth2推奨(クライアント資格証明)または別のPolarisでサポートされているトークン・メカニズム。
OAuth2資格証明を作成します:
次のプロシージャは、Apache Polaris Icebergカタログへのアクセスを認証するために、POLARIS_OAUTHという名前のOAuth2資格証明を作成します。
BEGIN
BEGIN DBMS_CLOUD.DROP_CREDENTIAL('POLARIS_OAUTH'); EXCEPTION WHEN OTHERS THEN NULL; END;
DBMS_CLOUD.CREATE_CREDENTIAL(
credential_name => 'POLARIS_OAUTH',
username => '<client_id>',
password => '<client_secret>'
);
END;
/
ストレージ資格証明の作成
次の手順では、AWSアクセス・キーIDおよびシークレット・アクセス・キーを使用してオブジェクト・ストレージ(例: Amazon S3)にアクセスするためのS3_CREDという名前のストレージ資格証明を作成します。
-- Storage credential for your object store (example: S3)
BEGIN
BEGIN DBMS_CLOUD.DROP_CREDENTIAL('S3_CRED'); EXCEPTION WHEN OTHERS THEN NULL; END;
DBMS_CLOUD.CREATE_CREDENTIAL(
credential_name => 'S3_CRED',
username => '<aws_access_key_id>',
password => '<aws_secret_access_key>'
);
END;
/外部表の作成
SALES_POLARISという外部表を定義します。BEGIN
DBMS_CLOUD.CREATE_EXTERNAL_TABLE(
table_name => 'SALES_POLARIS',
credential_name => 'S3_CRED',
format => '{
"access_protocol": {
"protocol_type": "iceberg-rest",
"protocol_config": {
"iceberg_catalog_type": "polaris",
"rest_catalog_endpoint": "<https://<your-polaris-endpoint>/...>",
"rest_authentication": {
"rest_auth_cred": "POLARIS_OAUTH",
"rest_auth_endpoint": "<https://<your-oauth-token-endpoint>>"
},
"table_path": ["<db>","<schema>","<table>"]
}
}
}'
);
END;
/クイック機能チェック
SELECT COUNT(*) FROM SALES_POLARIS;ノート:
エンドポイントおよびトークンURLプレースホルダは、Polaris構成によって異なるため保持します。
AWS Glueカタログ
このトピックでは、AWS資格情報を使用して、登録済みのIcebergテーブルでGlue Data Catalog経由で Amazon S3データにアクセスする方法について説明します。
-
Iceberg表が登録されているGlueデータ・カタログ(アクセス可能なS3オブジェクト)。
Glueのリージョン名(
us-east-1など)。 -
認証: S3のアクセス・キー/シークレット。カタログ構成を介した接着アクセス。
- AWS ARNによる資格情報の送信はサポートされていません。 明示的な資格証明を指定する必要があります。
ストレージ資格証明の作成
次のプロシージャは、Amazon S3バケットに格納されているデータへのアクセスを有効にするために、データブリックにS3_CREDという名前のストレージ資格証明を作成します。
-- S3 credential
BEGIN
BEGIN DBMS_CLOUD.DROP_CREDENTIAL('S3_CRED'); EXCEPTION WHEN OTHERS THEN NULL; END;
DBMS_CLOUD.CREATE_CREDENTIAL(
credential_name => 'S3_CRED',
username => '<aws_access_key_id>',
password => '<aws_secret_access_key>'
);
END;
/外部Iceberg表の作成
ORDERS_GLUEという名前の外部Iceberg表を作成します。BEGIN
DBMS_CLOUD.CREATE_EXTERNAL_TABLE(
table_name => 'ORDERS_GLUE',
credential_name => 'S3_CRED',
format => '{
"access_protocol": {
"protocol_type": "iceberg",
"protocol_config": {
"iceberg_catalog_type": "aws_glue",
"iceberg_glue_region": "us-east-1",
"table_path": ["<database>","<table>"]
}
}
}'
);
END;
/クイック機能チェック
ORDERS_GLUE内のすべての行をカウントし、接続およびデータ・アクセシビリティを検証します。SELECT COUNT(*) FROM ORDERS_GLUE;Hadoop/ファイルシステム(ダイレクト・メタデータ・ファイル)
このトピックでは、ADLS、S3、OCIなどのオブジェクト・ストアから直接Iceberg表のメタデータ・ファイルにアクセスするためのストレージ資格証明を作成する方法について説明します。 ここでは、カタログ・サービスを使用せずに、ファイル・システム(通常はHadoop互換ファイル・システム)に直接格納されているIceberg表の直接メタデータ管理のタイプの分類について説明します。
例: JSONメタデータを使用したIceberg表の問合せ
- オブジェクト・ストア(ADLS/S3/OCI)の表のIcebergルート・マニフェスト(
metadata.json)にアクセスできます。 - このパスは point-in-timeです。 新しいスナップショットをたどるには、外部表を再作成します。
ストレージ資格証明の作成
このプロシージャは、STORE_CREDという既存の資格証明が存在する場合は、まず削除を試行します(エラーは無視されます)。 次に、STORE_CREDという名前の新しい資格証明を作成します。
-- Storage credential for wherever the metadata.json lives
BEGIN
BEGIN DBMS_CLOUD.DROP_CREDENTIAL('STORE_CRED'); EXCEPTION WHEN OTHERS THEN NULL; END;
DBMS_CLOUD.CREATE_CREDENTIAL(
credential_name => 'STORE_CRED',
username => '<user-or-key>',
password => '<secret-or-token>'
);
END;
/外部表の作成
CUSTOMERS_METAという名前の外部表が作成されます。BEGIN
DBMS_CLOUD.CREATE_EXTERNAL_TABLE(
table_name => 'CUSTOMERS_META',
credential_name => 'STORE_CRED',
file_uri_list => 'https://<bucket-or-container>/<path>/metadata.json',
format => '{"access_protocol":{"protocol_type":"iceberg"}}'
);
END;
/クイック機能チェック
次のプロシージャは、外部表のすべての行をカウントする問合せを実行します。
SELECT COUNT(*) FROM CUSTOMERS_META;例: OCI上のHadoopカタログを使用したIceberg表の問合せ
この例では、OCIデータ・フローを使用して作成されたIceberg表db.icebergTablePyを問い合せます。ここで、SparkはIcebergカタログにHadoopCatalog実装を使用します。 HadoopCatalogは、バケットmy-iceberg-bucketのウェアハウス・フォルダicebergを使用し、Icebergメタデータをこのディレクトリの下の$database_name/$table_nameサブフォルダに配置します。 また、最新のメタデータ・ファイル・バージョンのバージョン番号を含むversion-hint.textファイルも使用します。
db.icebergTablePyの外部表を作成します:BEGIN
DBMS_CLOUD.CREATE_EXTERNAL_TABLE (
table_name => 'iceberg_parquet_time_dim3',
credential_name => 'OCI_CRED',
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;
/