

 从补丁 198 开始，Amazon Redshift 将不再支持创建新的 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 数据库的引用，也可以使用三部分表示法直接访问自动挂载的目录。

## 使用外部架构引用 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>

您可以使用三部分表示法，直接引用自动挂载的目录中的表而无需创建外部架构。在处理与 AWS Lake Formation 联合的 Amazon S3 表存储桶时，此方法尤为有用。有关设置 Data Catalog 自动挂载的信息，请参阅 [Simplify external object access in Amazon Redshift using automatic mounting of the 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)。

您也可以使用 `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 集群或工作组具有必要的 IAM 权限，可以访问存储 Iceberg 表的 Amazon S3 位置以及 Data Catalog 元数据。
+ **监控查询性能**：使用 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;
```