

 Amazon Redshift 將不再支援在 2026 年 6 月 30 日之後使用 Python UDFs。我們將開始分階段強制執行。如需 Python 生命週期結束和遷移選項的詳細資訊，請參閱 2025 年 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 資料表的資料目錄資料庫參考，或使用三段式表示法直接存取自動掛載的目錄。

## 使用外部結構描述參考 Iceberg 資料表
<a name="referencing-iceberg-external-schemas"></a>

外部結構描述可讓您從 Amazon Redshift 內參考 Data Catalog 中的資料表。當您建立外部結構描述時，您可以在 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}}';
```

建立外部結構描述後，您可以使用兩段式表示法查詢 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;
```

## 搭配自動掛載的目錄使用三部分標記法
<a name="referencing-iceberg-three-part-notation"></a>

使用三部分表示法，您可以直接參考自動掛載目錄中的資料表，而無需建立外部結構描述。此方法在使用與 聯合的 Amazon S3 資料表儲存貯體時特別有用 AWS Lake Formation。如需設定 Data Catalog 自動掛載的資訊，請參閱[使用 的自動掛載簡化 Amazon Redshift 中的外部物件存取 AWS Glue Data Catalog](https://aws.amazon.com/blogs/big-data/simplify-external-object-access-in-amazon-redshift-using-automatic-mounting-of-the-aws-glue-data-catalog/)。

三部分表示法的語法為：

```
{{"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)。 *Amazon S3 *

您也可以參考自動掛載根目錄 下的資料表`awsdatacatalog`，該目錄可讓您直接存取在 中註冊的資料庫和資料表 AWS Glue Data Catalog：

```
SELECT * FROM awsdatacatalog.{{my_database}}.{{my_iceberg_table}};
```

如需使用`awsdatacatalog`根目錄的詳細資訊，請參閱《*Amazon Redshift 管理指南*》中的[查詢 AWS Glue Data Catalog](https://docs.aws.amazon.com/redshift/latest/mgmt/query-editor-v2-glue.html) 和《 *AWS Lake Formation 開發人員指南*[》中的管理資料目錄命名空間](https://docs.aws.amazon.com/lake-formation/latest/dg/managing-namespaces-datacatalog.html)。

您也可以使用 `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_path`僅支援 `s3tablescatalog`。它們無法與 搭配使用`awsdatacatalog`。若要參考 中的資料表`awsdatacatalog`，請使用完整的三部分表示法。

## 參考 Iceberg 資料表的最佳實務
<a name="referencing-iceberg-best-practices"></a>

Apache Iceberg 資料表是由多個檔案組成的單一邏輯實體：根中繼資料檔案 (metadata.json)、資訊清單清單、資訊清單檔案和資料檔案 （通常是 .parquet)。根中繼資料檔案做為進入點，其中包含組成資料表的所有其他檔案的參考。當您授予 Amazon Redshift 對 Iceberg 資料表的存取權時，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_lake`或 `customer_analytics`。
+ **利用資料表統計資料** – 確定使用 為您的 Iceberg 資料表產生資料欄統計資料 AWS Glue ，以最佳化查詢效能。Amazon Redshift 使用這些統計資料進行查詢規劃和最佳化。
+ **考量資料新鮮度** – 在您查詢時，其他服務可能會更新 Iceberg 資料表。Amazon Redshift 提供交易一致性，確保您在查詢執行期間看到一致的資料快照。
+ **使用適當的 IAM 許可** – 請確定您的 Amazon Redshift 叢集或工作群組具有必要的 IAM 許可，可存取存放 Iceberg 資料表的 Amazon S3 位置，以及資料目錄中繼資料。
+ **資料表層級許可** – 在資料表層級授予許可，而不是在個別檔案層級授予許可。
+ **統一許可** – 維護 Iceberg 資料表在整個 Amazon S3 路徑的統一存取，包括所有中繼資料、資訊清單和資料檔案。
+ **避免限制性物件層級政策** – 請勿在 Iceberg 資料表字首內的個別 Parquet 檔案上設定限制性物件層級政策。
+ **了解快取 TTL 的許可變更** – 當您撤銷 Iceberg 資料表上的 Amazon S3 許可時，查詢可能會繼續使用快取的根中繼資料，直到設定的 TTL 持續時間為止 （預設值：2 分鐘）。
+ **監控查詢效能** – 使用 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;
```

**搭配複雜查詢使用三部分表示法：**

```
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;
```