View a markdown version of this page

Amazon Redshift での Iceberg テーブルの参照 - Amazon Redshift

Amazon Redshift は、パッチ 198 以降、新しい Python UDF の作成をサポートしなくなります。既存の Python UDF は、2026 年 6 月 30 日まで引き続き機能します。詳細については、ブログ記事を参照してください。

Amazon Redshift での Iceberg テーブルの参照

Amazon Redshift には、データレイクに保存されている Apache Iceberg テーブルを参照する複数の方法が用意されています。外部スキーマを使用して Iceberg テーブルを含む Data Catalog データベースへの参照を作成することも、自動マウントカタログへの直接アクセスに 3 つの部分からなる表記を使用することもできます。

外部スキーマを使用して Iceberg テーブルを参照する

外部スキーマは、Amazon Redshift 内からデータカタログ内のテーブルを参照する方法を提供します。外部スキーマを作成するときは、Amazon Redshift データベースと Iceberg テーブルを含む特定の Data Catalog データベース間の接続を確立します。

Iceberg テーブルの外部スキーマを作成するには

CREATE EXTERNAL SCHEMA schema_name FROM DATA CATALOG DATABASE 'glue_database_name' IAM_ROLE 'arn:aws:iam::account-id:role/role-name';

外部スキーマを作成したら、2 つの部分からなる表記を使用して Iceberg テーブルをクエリできます。

SELECT * FROM schema_name.iceberg_table_name;

Iceberg テーブルをローカル Amazon Redshift テーブルと結合することもできます。

SELECT r.customer_id, i.order_date, r.customer_name FROM local_customers r JOIN schema_name.iceberg_orders i ON r.customer_id = i.customer_id;

自動マウントカタログでの 3 つの部分からなる表記の使用

3 つの部分からなる表記では、外部スキーマを作成することなく、自動マウントカタログ内のテーブルを直接参照できます。この方法は、AWS Lake Formation とフェデレーションされた Amazon S3 テーブルバケットを使用する場合に特に便利です。データカタログの自動マウントの設定については、「AWS Glue Data Catalog の自動マウントを使用した Amazon Redshift での外部オブジェクトアクセスの簡素化」を参照してください。

3 つの部分からなる表記の構文は次のとおりです。

"catalog_name".database_name.table_name

例えば、自動マウントされた Amazon S3 テーブルカタログで Iceberg テーブルをクエリするには

SELECT * FROM "my_table_bucket@s3tablescatalog".my_database.my_iceberg_table;

Amazon S3 テーブルバケットと Amazon Redshift の統合の詳細については、「Amazon S3 ユーザーガイド」の「S3 テーブルと Amazon Redshift の統合」を参照してください。

自動マウントルートカタログ awsdatacatalog のテーブルを参照することもできます。これにより、AWS Glue Data Catalog に登録されているデータベースとテーブルに直接アクセスできます。

SELECT * FROM awsdatacatalog.my_database.my_iceberg_table;

awsdatacatalog ルートカタログの使用の詳細については、「Amazon Redshift 管理ガイド」の「AWS Glue Data Catalog のクエリ」および「AWS Lake Formation デベロッパーガイド」の「データカタログ名前空間の管理」を参照してください。

USE ステートメントを使用して、Amazon S3 テーブルバケット用のデフォルトのカタログとデータベースを設定することもできます。

USE "my_table_bucket@s3tablescatalog".my_database; SELECT * FROM my_iceberg_table;

Amazon S3 テーブルバケットを使用してスキーマ解決の検索パスを設定するには:

USE "my_table_bucket@s3tablescatalog"; SET search_path TO my_database; SELECT * FROM my_iceberg_table;
注記

USE ステートメントおよび search_paths3tablescatalog でサポートされていません。awsdatacatalog と共には使用できません。awsdatacatalog でテーブルを参照するには、完全な 3 つの部分からなる表記を使用します。

Iceberg テーブルを参照するためのベストプラクティス

Apache Iceberg テーブルは、ルートメタデータファイル (metadata.json)、マニフェストリスト、マニフェストファイル、データファイル (通常は .parquet) の複数のファイルで構成される単一の論理エンティティです。ルートメタデータファイルはエントリポイントとして機能し、テーブルを構成する他のすべてのファイルへの参照が含まれます。Iceberg テーブルへのアクセス権を Amazon Redshift に付与すると、Amazon Redshift はルートメタデータファイルを使用して、参照されるすべてのデータファイルを検出して読み取ります。Amazon Redshift がルートメタデータファイルにアクセスできる場合、基盤となるすべてのデータファイルにもアクセスすることを前提としています。これは、テーブルレベルのアクセスが意図した認可単位である Iceberg の設計と一致しています。

クエリのパフォーマンスを向上させるために、Amazon Redshift は Iceberg メタデータファイル (ルートメタデータファイル、マニフェストリスト、マニフェストファイルを含む) をメモリにキャッシュします。ルートメタデータファイル (metadata.json) は、設定可能な間隔 (TTL) で Amazon S3 に対して再検証されます。TTL の有効期限が切れると、Amazon Redshift はルートメタデータファイルに対して Amazon S3 HEAD リクエストを実行して、IAM ロールがまだアクセス可能であり、ファイルが変更されていないことを確認します。アクセス許可チェックが失敗するか、ファイルが変更された場合、キャッシュされたエントリは削除され、メタデータは Amazon S3 から再取得されます。ルートメタデータファイルはすべてのテーブルアクセスのエントリポイントであるため、この再検証はテーブル全体のアクセス許可ゲートとして機能します。マニフェストリストとマニフェストファイルは、独立した TTL の再検証なしでキャッシュされます。アクセスの有効性は、ルートメタデータのアクセス許可チェックから算出されます。つまり、Iceberg テーブルに対する Amazon S3 アクセス許可を取り消すと、キャッシュされたメタデータの使用中にクエリが最大 2 分間成功し続ける可能性があります。

重要

Amazon S3 では、個々のオブジェクトレベルでアクセス許可を設定できます。つまり、Iceberg テーブルのメタデータへのアクセスを許可しながら、基盤となるデータファイルの一部へのアクセスを制限することは技術的に可能です。これにより、Amazon Redshift でクエリの失敗や予期しないアクセスエラーにつながる可能性のあるアクセス許可の不整合が作成されます。

Amazon Redshift は、キャッシュされたルートメタデータファイルへのアクセスを定期的に検証しますが、Amazon S3 バケット内のメタデータレベルとdata-file-levelアクセス許可間の整合性を検証または強制しません。Iceberg テーブルを構成するすべてのファイルにアクセス許可が一貫して適用されるようにすることは、お客様の責任です。

これを回避するには、Amazon Redshift で Iceberg テーブルを参照するときは、次のベストプラクティスを考慮してください。

  • わかりやすいスキーマ名を使用する – 外部スキーマを作成するときは、sales_data_lakecustomer_analytics など、データのソースと目的を明確に示す名前を使用します。

  • テーブル統計を活用する – AWS Glue を使用してクエリパフォーマンスを最適化し、Iceberg テーブルの列統計が生成されていることを確認します。Amazon Redshift は、クエリの計画と最適化にこれらの統計を使用します。

  • データの鮮度を考慮する – Iceberg テーブルは、クエリ中に他のサービスによって更新される可能性があります。Amazon Redshift はトランザクションの整合性を提供し、クエリの実行中にデータの整合性のあるスナップショットを確認できるようにします。

  • 適切な IAM アクセス許可を使用する – Amazon Redshift クラスターまたはワークグループに、Iceberg テーブルが保存されている Amazon S3 の場所と Data Catalog メタデータにアクセスするために必要な IAM アクセス許可があることを確認します。

  • テーブルレベルのアクセス許可 – 個々のファイルレベルではなく、テーブルレベルでアクセス許可を付与します。

  • 統一されたアクセス許可 – すべてのメタデータ、マニフェスト、データファイルを含む、Iceberg テーブルの Amazon S3 パス全体で統一されたアクセスを確保します。

  • 制限的なオブジェクトレベルのポリシーを避ける – Iceberg テーブルのプレフィックス内の個々の Parquet ファイルに制限的なオブジェクトレベルのポリシーを設定しないでください。

  • アクセス許可の変更に関するキャッシュ TTL を理解する – Iceberg テーブルの Amazon S3 アクセス許可を取り消すと、設定された TTL 期間 (デフォルト: 2 分) まで、キャッシュされたルートメタデータを使用してクエリが成功し続ける可能性があります。

  • クエリパフォーマンスのモニタリング – Amazon Redshift クエリモニタリング機能を使用して、Iceberg テーブルに対するクエリのパフォーマンスを追跡し、必要に応じて最適化します。

一般的な参照パターン

次の例は、Iceberg テーブルを参照するための一般的なパターンを示しています。

複数の Iceberg テーブル間でのデータの集約

SELECT region, SUM(sales_amount) as total_sales, COUNT(*) as transaction_count FROM data_lake.sales_transactions WHERE transaction_date >= '2024-01-01' GROUP BY region ORDER BY total_sales DESC;

Iceberg テーブルとローカル Amazon Redshift テーブルの結合

SELECT c.customer_name, c.customer_tier, SUM(o.order_amount) as total_orders FROM customers c JOIN data_lake.order_history o ON c.customer_id = o.customer_id WHERE o.order_date >= CURRENT_DATE - INTERVAL '30 days' GROUP BY c.customer_name, c.customer_tier;

複雑なクエリでの 3 つの部分からなる表記の使用

WITH recent_orders AS ( SELECT customer_id, order_date, order_amount FROM "analytics_bucket@s3tablescatalog".ecommerce.orders WHERE order_date >= CURRENT_DATE - INTERVAL '7 days' ) SELECT customer_id, COUNT(*) as order_count, AVG(order_amount) as avg_order_value FROM recent_orders GROUP BY customer_id HAVING COUNT(*) > 1;