

 Amazon Redshift は、パッチ 198 以降、新しい Python UDF の作成をサポートしなくなります。既存の Python UDF は、2026 年 6 月 30 日まで引き続き機能します。詳細については、[ブログ記事](https://aws.amazon.com/blogs/big-data/amazon-redshift-python-user-defined-functions-will-reach-end-of-support-after-june-30-2026/)を参照してください。

# Amazon Redshift での Iceberg テーブルの参照
<a name="referencing-iceberg-tables"></a>

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

## 外部スキーマを使用して Iceberg テーブルを参照する
<a name="referencing-iceberg-external-schemas"></a>

外部スキーマは、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 つの部分からなる表記の使用
<a name="referencing-iceberg-three-part-notation"></a>

3 つの部分からなる表記では、外部スキーマを作成することなく、自動マウントカタログ内のテーブルを直接参照できます。この方法は、AWS Lake Formation とフェデレーションされた Amazon S3 テーブルバケットを使用する場合に特に便利です。データカタログの自動マウントの設定については、「[AWS Glue Data Catalog の自動マウントを使用した Amazon Redshift での外部オブジェクトアクセスの簡素化](https://aws.amazon.com/blogs/big-data/simplify-external-object-access-in-amazon-redshift-using-automatic-mounting-of-the-aws-glue-data-catalog/)」を参照してください。

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 の統合](https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-tables-integrating-redshift.html)」を参照してください。

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

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

スキーマ解決の検索パスを設定するには

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

## Iceberg テーブルを参照するためのベストプラクティス
<a name="referencing-iceberg-best-practices"></a>

Amazon Redshift で Iceberg テーブルを参照するときは、次のベストプラクティスを考慮してください。
+ **わかりやすいスキーマ名を使用する** – 外部スキーマを作成するときは、`sales_data_lake` や `customer_analytics` など、データのソースと目的を明確に示す名前を使用します。
+ **テーブル統計を活用する** – AWS Glue を使用してクエリパフォーマンスを最適化し、Iceberg テーブルの列統計が生成されていることを確認します。Amazon Redshift は、クエリの計画と最適化にこれらの統計を使用します。
+ **データの鮮度を考慮する** – Iceberg テーブルは、クエリ中に他のサービスによって更新される可能性があります。Amazon Redshift はトランザクションの整合性を提供し、クエリの実行中にデータの整合性のあるスナップショットを確認できるようにします。
+ **適切な IAM アクセス許可を使用する** – Amazon Redshift クラスターまたはワークグループに、Iceberg テーブルが保存されている Amazon S3 の場所と Data Catalog メタデータにアクセスするために必要な IAM アクセス許可があることを確認します。
+ **クエリパフォーマンスのモニタリング** – Amazon Redshift クエリモニタリング機能を使用して、Iceberg テーブルに対するクエリのパフォーマンスを追跡し、必要に応じて最適化します。

## 一般的な参照パターン
<a name="referencing-iceberg-examples"></a>

次の例は、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;
```