

# Amazon S3 테이블 생성
<a name="s3-tables-create"></a>

Amazon S3 테이블은 테이블 버킷의 하위 리소스입니다. 테이블은 Apache Iceberg 형식으로 저장되므로 쿼리 엔진 및 Apache Iceberg를 지원하는 기타 애플리케이션을 사용하여 테이블을 사용할 수 있습니다. Amazon S3는 테이블을 지속적으로 최적화하여 스토리지 비용을 줄이고 분석 쿼리 성능을 개선합니다.

테이블을 생성하면 Amazon S3가 테이블의 *웨어하우스 위치*를 자동으로 생성합니다. 웨어하우스 위치는 테이블과 연결된 객체를 읽고 쓸 수 있는 고유한 S3 위치입니다. 다음 예시에서는 웨어하우스 위치의 형식을 보여줍니다.

```
s3://63a8e430-6e0b-46f5-k833abtwr6s8tmtsycedn8s4yc3xhuse1b--table-s3
```

테이블의 Amazon 리소스 이름(ARN) 형식은 다음과 같습니다.

```
arn:aws:s3tables:region:owner-account-id:bucket/bucket-name/table/table-id
```

기본적으로 테이블 버킷에 최대 1만 개의 테이블을 생성할 수 있습니다. 테이블 버킷 또는 테이블에 대한 할당량 증가를 요청하려면 [지원](https://console.aws.amazon.com/support/home#/case/create?issueType=service-limit-increase)에 문의하세요.

Amazon S3 콘솔, Amazon S3 REST API, AWS SDK, AWS Command Line Interface(AWS CLI) 또는 테이블 버킷에 연결된 쿼리 엔진을 사용하여 테이블을 생성할 수 있습니다.

Athena를 사용하여 테이블을 생성하지 않는 한, 테이블을 생성할 때 해당 테이블에 대한 암호화 설정을 지정할 수 있습니다. 암호화 설정을 지정하지 않으면 테이블이 테이블 버킷의 기본 설정으로 암호화됩니다. 자세한 내용은 [테이블에 대한 암호화 지정](s3-tables-kms-specify.md#specify-kms-table) 섹션을 참조하세요.

**테이블 생성을 위한 사전 조건**

테이블을 생성하려면 먼저 다음을 수행해야 합니다.
+ [테이블 버킷 생성](s3-tables-buckets-create.md).
+ 테이블 버킷에 [ 네임스페이스 생성](s3-tables-namespace-create.md)합니다.
+ `s3tables:CreateTable` 및 `s3tables:PutTableData`에 대한 AWS Identity and Access Management(IAM) 권한이 있는지 확인합니다.
+ 
**참고**  
테이블에 SSE-KMS 암호화를 사용하는 경우 `s3tables:PutTableEncryption` 권한과 선택한 AWS KMS 키에 대한 `DescribeKey` 권한이 필요합니다. 또한 사용하는 AWS KMS 키가 S3 Tables에 자동 테이블 유지 관리를 수행할 수 있는 권한을 부여해야 합니다. 자세한 내용은 [S3 Tables SSE-KMS 암호화에 대한 권한 요구 사항](s3-tables-kms-permissions.md) 섹션을 참조하세요.

유효한 테이블 이름에 대한 자세한 내용은 [테이블 및 네임스페이스의 이름 지정 규칙](s3-tables-buckets-naming.md#naming-rules-table) 섹션을 참조하세요.

**중요**  
테이블을 만들 때 테이블 이름 및 테이블 정의에 모두 소문자를 사용해야 합니다. 예를 들어 열 이름이 모두 소문자인지 확인합니다. 테이블 이름 또는 테이블 정의에 대문자가 포함된 경우 테이블은 AWS Lake Formation 또는 AWS Glue Data Catalog에서 지원되지 않습니다. 이 경우 테이블 버킷이 AWS 분석 서비스와 통합되어 있더라도 Amazon Athena와 같은 AWS 분석 서비스에는 테이블이 표시되지 않습니다.  
테이블 정의에 대문자가 포함된 경우 Athena에서 `SELECT` 쿼리를 실행할 때 "GENERIC\$1INTERNAL\$1ERROR: Get table request failed: com.amazonaws.services.glue.model.ValidationException: Unsupported Federation Resource - Invalid table or column names."라는 오류 메시지가 표시됩니다.

## S3 콘솔 및 Amazon Athena 사용
<a name="create-table-console"></a>

다음 절차에서는 Amazon S3 콘솔을 사용하여 Amazon Athena로 테이블을 생성합니다. 테이블 버킷에 네임스페이스를 아직 생성하지 않은 경우 이 프로세스 중에 생성할 수 있습니다. 다음 단계를 수행하기 전에 테이블 버킷을 이 리전의 AWS 분석 서비스와 통합했는지 확인합니다. 자세한 내용은 [AWS 분석 서비스와 Amazon S3 Tables 통합](s3-tables-integrating-aws.md) 섹션을 참조하세요.

**참고**  
Athena를 사용하여 테이블을 생성하면 해당 테이블은 테이블 버킷에서 기본 암호화 설정을 상속합니다. 다른 암호화 유형을 사용하려면 다른 방법을 사용하여 테이블을 생성해야 합니다.

**테이블을 만들려면**

1. AWS Management Console에 로그인한 후 [https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/)에서 S3 콘솔을 엽니다.

1. 왼쪽 탐색 창에서 **테이블 버킷**을 선택합니다.

1. **테이블 버킷** 페이지에서 테이블을 생성할 버킷을 선택합니다.

1. 버킷 세부 정보 페이지에서 **Athena로 테이블 생성**을 선택합니다.

1. **Athena로 테이블 생성** 대화 상자에서 다음 중 하나를 수행합니다.
   + 네임스페이스를 새로 생성합니다. **네임스페이스 생성**을 선택한 다음 **네임스페이스 이름** 필드에 이름을 입력합니다. 네임스페이스 이름은 1\$1255자여야 하며 테이블 버킷 내에서 고유해야 합니다. 유효한 문자는 a-z, 0-9 및 밑줄(`_`)입니다. 네임스페이스 이름 시작에는 밑줄이 허용되지 않습니다.
   + **Create namespace(네임스페이스 생성)**를 선택합니다.
   + 기존 네임스페이스를 지정합니다. **이 테이블 버킷 내의 기존 네임스페이스 지정**을 선택합니다. 그런 다음 **기존 네임스페이스에서 선택** 또는 **기존 네임스페이스 이름 입력**을 선택합니다. 버킷에 네임스페이스가 1,000개 이상인 경우 목록에 표시되지 않는 네임스페이스 이름을 입력해야 합니다.

1. **Athena로 테이블 생성**을 선택합니다.

1. Amazon Athena 콘솔이 열리고 Athena 쿼리 편집기가 나타납니다. **카탈로그** 필드는 **s3tablescatalog/**와 같은 테이블 버킷 이름으로 채워지고, 테이블 버킷의 이름, 예를 들어, **s3tablescatalog/*amzn-s3-demo-bucket***로 채워야 합니다. **데이터베이스** 필드는 이전에 생성하거나 선택한 네임스페이스로 채워져야 합니다.
**참고**  
**카탈로그** 및 **데이터베이스** 필드에 이러한 값이 표시되지 않는 경우 테이블 버킷을 이 리전의 AWS 분석 서비스와 통합했는지 확인합니다. 자세한 내용은 [AWS 분석 서비스와 Amazon S3 Tables 통합](s3-tables-integrating-aws.md) 섹션을 참조하세요.

1. 쿼리 편집기는 테이블을 생성하는 데 사용할 수 있는 샘플 쿼리로 채워집니다. 쿼리를 수정하여 테이블에 포함할 테이블 이름과 열을 지정합니다.

1. 쿼리 수정을 마치면 **실행**을 선택하여 테이블을 생성합니다.
**참고**  
Athena에서 쿼리를 실행하려고 할 때 “쿼리를 실행할 권한이 충분하지 않습니다. 위탁자는 지정된 리소스에 대한 권한이 없습니다." 오류가 표시되면 테이블에서 필요한 Lake Formation 권한이 부여되어야 합니다. 자세한 내용은 [테이블 또는 데이터베이스에 대한 Lake Formation 권한 부여](grant-permissions-tables.md#grant-lf-table) 섹션을 참조하세요.
Athena에서 쿼리를 실행하려고 할 때 "Iceberg가 요청된 리소스에 액세스할 수 없음" 오류가 표시되면 AWS Lake Formation 콘솔로 이동하여 생성한 테이블 버킷 카탈로그 및 데이터베이스(네임스페이스)에 대한 권한을 자신에게 부여했는지 확인합니다. 이러한 권한을 부여할 때 테이블을 지정하지 마십시오. 자세한 내용은 [테이블 또는 데이터베이스에 대한 Lake Formation 권한 부여](grant-permissions-tables.md#grant-lf-table) 섹션을 참조하세요.
Athena에서 `SELECT` 쿼리를 실행할 때 다음 오류 메시지가 표시되는 경우 테이블 이름이나 테이블 정의의 열 이름에 대문자가 있기 때문입니다. "GENERIC\$1INTERNAL\$1ERROR: Get table request failed: com.amazonaws.services.glue.model.ValidationException: Unsupported Federation Resource - Invalid table or column names." 테이블 및 열 이름이 모두 소문자인지 확인합니다.

테이블 생성에 성공하면 Athena의 테이블 목록에 새 테이블 이름이 나타납니다. Amazon S3 콘솔로 돌아가면 목록을 새로 고친 후 테이블 버킷의 버킷 세부 정보 페이지에 있는 **테이블** 목록에 새 테이블이 나타납니다.

## AWS CLI 사용
<a name="create-table-CLI"></a>

이 예제에서는 AWS CLI를 사용하고 JSON으로 테이블 메타데이터를 지정하여 스키마가 있는 테이블을 생성하는 방법을 보여줍니다. 이 예제를 사용하려면 `user input placeholders`를 사용자의 정보로 대체합니다.

```
aws s3tables create-table --cli-input-json file://mytabledefinition.json
```

`mytabledefinition.json` 파일의 경우 다음 예제 테이블 정의를 사용합니다. 이 예제를 사용하려면 `user input placeholders`를 사용자의 정보로 대체합니다.

```
{
    "tableBucketARN": "arn:aws:s3tables:us-east-1:111122223333:bucket/amzn-s3-demo-table-bucket",
    "namespace": "your_namespace",
    "name": "example_table",
    "format": "ICEBERG",
    "metadata": {
        "iceberg": {
            "schema": {
                "fields": [
                     {"name": "id", "type": "int","required": true},
                     {"name": "name", "type": "string"},
                     {"name": "value", "type": "int"}
                ]
            }
        }
    }
}
```

## 쿼리 엔진 사용
<a name="create-table-engine"></a>

Amazon EMR의 Apache Spark 세션에서와 같이 테이블 버킷에 연결된 지원되는 쿼리 엔진에서 테이블을 생성할 수 있습니다.

이 예시에서는 Spark에서 `CREATE` 문을 사용하여 테이블을 생성하고 `INSERT` 문을 사용하여 테이블 데이터를 추가하거나 기존 파일에서 데이터를 읽는 방법을 보여줍니다. 이 예제를 사용하려면 `user input placeholders`를 사용자의 정보로 대체합니다.

```
spark.sql( 
" CREATE TABLE IF NOT EXISTS s3tablesbucket.example_namespace.`example_table` ( 
    id INT, 
    name STRING, 
    value INT 
) 
USING iceberg "
)
```

테이블을 생성한 후 테이블에 데이터를 로드할 수 있습니다. 다음 방법 중에서 선택하세요.
+ `INSERT` 문을 사용하여 테이블에 데이터를 추가합니다.

  ```
  spark.sql(
  """
      INSERT INTO s3tablesbucket.my_namespace.my_table 
      VALUES 
          (1, 'ABC', 100), 
          (2, 'XYZ', 200)
  """)
  ```
+ 기존 데이터 파일을 로드합니다.

  1. Spark로 데이터를 읽습니다.

     ```
     val data_file_location = "Path such as S3 URI to data file"
     val data_file = spark.read.parquet(data_file_location)
     ```

  1. Iceberg 테이블에 데이터를 기록합니다.

     ```
     data_file.writeTo("s3tablesbucket.my_namespace.my_table").using("Iceberg").tableProperty ("format-version", "2").createOrReplace()
     ```