

 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 테이블이 포함된 데이터 카탈로그 데이터베이스에 대한 참조를 생성하거나, 세 부분으로 구성된 주석을 사용하여 자동 마운트된 카탈로그에 직접 액세스할 수 있습니다.

## 외부 스키마를 사용하여 Iceberg 테이블 참조
<a name="referencing-iceberg-external-schemas"></a>

외부 스키마는 Amazon Redshift 내에서 데이터 카탈로그의 테이블을 참조하는 방법을 제공합니다. 외부 스키마를 생성할 때 Amazon Redshift 데이터베이스와 Iceberg 테이블이 포함된 특정 데이터 카탈로그 데이터베이스 간에 연결을 설정합니다.

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 테이블 버킷으로 작업할 때 특히 유용합니다. 데이터 카탈로그의 자동 마운트 설정에 대한 자세한 내용은 [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/)를 참조하세요.

세 부분으로 구성된 주석의 구문은 다음과 같습니다.

```
"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 Tables를 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 위치와 데이터 카탈로그 메타데이터에 액세스하는 데 필요한 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;
```

**복잡한 쿼리와 함께 세 부분으로 구성된 주석 사용:**

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