

# Athena에서 테이블 생성
<a name="creating-tables"></a>

테이블을 생성하려면 Athena 콘솔에서 DDL 문을 실행하거나 Athena [**테이블 생성** 양식](creating-tables-how-to.md#to-create-a-table-using-the-wizard)을 사용하거나 JDBC 또는 ODBC 드라이버를 사용할 수 있습니다. Athena는 Apache Hive를 사용하여 테이블을 정의하고 데이터베이스를 생성하며, 이는 테이블의 논리적 네임스페이스입니다. Athena는 특정 데이터 형식의 테이블을 생성하는 데 다양한 SerDe(serializer-deserializer) 라이브러리를 지원합니다. 지원되는 SerDe 라이브러리 목록은 [데이터에 적합한 SerDe 선택](supported-serdes.md) 단원을 참조하세요.

Athena에서 데이터베이스와 테이블을 생성할 때, 읽기 시간 쿼리를 위해 Amazon S3에서 테이블 데이터가 있는 스키마와 위치를 간단히 설명합니다. Athena는 Amazon S3의 데이터를 수정하지 않습니다. 따라서 데이터베이스와 테이블이 데이터베이스와 테이블의 스키마 정의와 함께 저장되지 않으므로 기존 관계형 데이터베이스 시스템에서와 의미가 약간 다릅니다.

Athena는 AWS Glue Data Catalog에 스키마를 저장하고 사용자가 SQL을 사용하여 테이블을 쿼리할 때 이 스키마를 사용하여 데이터를 읽습니다. 쿼리를 실행할 때 데이터에 스키마를 프로젝션하는 이 *스키마 온 리드* 접근 방식을 사용하면 데이터를 로드하거나 변환할 필요가 없습니다.

## 고려 사항 및 제한 사항
<a name="creating-tables-considerations-and-limitations"></a>

Athena의 테이블에 대한 몇 가지 중요한 제한 사항 및 고려 사항은 다음과 같습니다.

### Amazon S3 고려 사항
<a name="s3-considerations"></a>

테이블을 만들 때 `LOCATION` 절을 사용하여 기본 데이터의 Amazon S3 버킷 위치를 지정합니다. 다음을 고려하세요.
+ Athena는 버전이 지정된 Amazon S3 버킷에 있는 최신 버전의 데이터만 쿼리할 수 있으며, 이전 버전의 데이터는 쿼리할 수 없습니다.
+ 이를 위해서는 Amazon S3 위치에서 데이터를 처리할 수 있는 권한이 있어야 합니다. 자세한 내용은 [Athena에서 Amazon S3에 대한 액세스 제어](s3-permissions.md) 섹션을 참조하세요.
+ Athena는 `LOCATION` 절에 지정된 동일한 버킷의 여러 스토리지 클래스에 저장된 객체에 대한 쿼리를 지원합니다. 예를 들어 Amazon S3의 서로 다른 스토리지 클래스(Standard, Standard-IA, Intelligent-Tiering)에 저장된 객체의 데이터를 쿼리할 수 있습니다.
+ Athena는 [요청자 지불 버킷](https://docs.aws.amazon.com/AmazonS3/latest/userguide/RequesterPaysBuckets.html)을 지원합니다. Athena에서 쿼리하려고 하는 소스 데이터가 포함된 버킷에 대해 요청자 지불을 활성화하는 방법에 대한 자세한 내용은 [작업 그룹 만들기](creating-workgroups.md) 단원을 참조하세요.
+ Athena를 사용하여 Amazon Glacier Flexible Retrieval(이전의 Glacier) 및 Amazon Glacier Deep Archive [Amazon S3 스토리지 클래스](https://docs.aws.amazon.com/AmazonS3/latest/userguide/storage-class-intro.html#sc-glacier)로부터 복원된 객체를 쿼리할 수 있지만, 이 기능은 테이블별로 활성화해야 합니다. 쿼리를 실행하기 전에 테이블에서 이 기능을 활성화하지 않으면 Athena는 쿼리 실행 중에 테이블의 Amazon Glacier Flexible Retrieval 및 Amazon Glacier Deep Archive 객체를 모두 건너뜁니다. 자세한 내용은 [복원된 Amazon Glacier 객체 쿼리](querying-glacier.md) 섹션을 참조하세요.

  스토리지 클래스에 대한 자세한 내용은 *Amazon Simple Storage Service 사용 설명서*에서 [스토리지 클래스](https://docs.aws.amazon.com/AmazonS3/latest/dev/storage-class-intro.html), [Amazon S3에서 객체의 스토리지 클래스 변경](https://docs.aws.amazon.com/AmazonS3/latest/dev/ChgStoClsOfObj.html), [GLACIER 스토리지 클래스로 전환(객체 아카이브)](https://docs.aws.amazon.com/AmazonS3/latest/userguide/lifecycle-transition-general-considerations.html#before-deciding-to-archive-objects) 및 [요청자 지불 버킷](https://docs.aws.amazon.com/AmazonS3/latest/dev/RequesterPaysBuckets.html)을 참조하세요.
+ 객체가 많은 Amazon S3 버킷에 대해 쿼리를 실행하는데 데이터가 분할되지 않은 경우, 그러한 쿼리는 Amazon S3의 Get 요청 빈도 제한에 영향을 주고 Amazon S3 예외를 발생시킬 수 있습니다. 오류를 방지하려면 데이터를 분할하세요. 또한 Amazon S3 요청 빈도를 조정합니다. 자세한 내용은 [요청 빈도 및 성능 고려 사항](https://docs.aws.amazon.com/AmazonS3/latest/dev/request-rate-perf-considerations.html)을 참조하세요.

Amazon S3에서 데이터 위치를 지정하는 방법에 대한 자세한 내용은 [Amazon S3의 테이블 위치 지정](tables-location-format.md) 섹션을 참조하세요.

### 기타 고려 사항
<a name="creating-tables-other-considerations"></a>
+ **트랜잭션 데이터 변환은 지원되지 않음** – Athena는 테이블 데이터에 대한 트랜잭션 기반 작업(예: Hive 또는 Presto에 있는 작업)을 지원하지 않습니다. 지원되지 않는 키워드 전체 목록은 [지원되지 않는 DDL](unsupported-ddl.md)을 참조하세요.
+ **테이블에 대한 작업은 ACID** - 테이블을 생성하고 업데이트하거나 삭제할 때 이러한 작업은 ACID를 준수합니다. 예를 들어, 여러 사용자 또는 클라이언트가 동시에 테이블을 생성하거나 기존 테이블을 변경하려고 할 경우 그 중 하나만 성공합니다.
+ **테이블이 외부** - [Iceberg](querying-iceberg-creating-tables.md) 테이블을 생성할 때를 제외하고 항상 `EXTERNAL` 키워드를 사용하세요. Iceberg가 아닌 테이블에 대해 `EXTERNAL` 키워드 없이 `CREATE TABLE`을 사용하는 경우 Athena에서 오류가 발생합니다. Athena에 테이블을 놓으면 테이블 메타데이터만 제거됩니다. 데이터는 Amazon S3에 유지됩니다.
+ **최대 쿼리 문자열 길이** - 최대 쿼리 문자열 길이는 256KB입니다.
+ `TableType` 속성을 지정하지 않고 AWS Glue [CreateTable](https://docs.aws.amazon.com/glue/latest/webapi/API_CreateTable.html) API 작업 또는 CloudFormation [https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-table.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-table.html) 템플릿을 사용하여 Athena에서 사용할 테이블을 만든 다음 `SHOW CREATE TABLE` 또는 `MSCK REPAIR TABLE` 같은 DDL 쿼리를 실행하면, 실패: NullPointerException Name이 null임(FAILED: NullPointerException Name is null)이라는 오류 메시지가 표시될 수 있습니다.

  이 오류를 해결하려면 AWS Glue `CreateTable` API 호출 또는 [CloudFormation 템플릿](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-table-tableinput.html)의 일부로 [TableInput](https://docs.aws.amazon.com/glue/latest/webapi/API_TableInput.html) `TableType` 속성의 값을 지정하세요. `TableType`의 가능한 값은 `EXTERNAL_TABLE` 또는 `VIRTUAL_VIEW`입니다.

  이 요구 사항은 AWS Glue `CreateTable` API 작업 또는 `AWS::Glue::Table` 템플릿을 사용하여 테이블을 만들 때만 적용됩니다. DDL 문이나 AWS Glue 크롤러를 사용하여 Athena용 테이블을 생성할 경우 `TableType` 속성이 자동으로 정의됩니다.

**Topics**
+ [고려 사항 및 제한 사항](#creating-tables-considerations-and-limitations)
+ [AWS Glue 또는 Athena 콘솔을 사용하여 테이블 생성](creating-tables-how-to.md)
+ [Amazon S3의 테이블 위치 지정](tables-location-format.md)
+ [테이블 생성 후 테이블 정보 표시](creating-tables-showing-table-information.md)

# AWS Glue 또는 Athena 콘솔을 사용하여 테이블 생성
<a name="creating-tables-how-to"></a>

Athena에서 AWS Glue 또는 테이블 추가 양식을 사용하거나 Athena 쿼리 편집기에서 DDL 문을 실행하여 테이블을 생성할 수 있습니다.

## AWS Glue 크롤러를 사용하여 테이블 생성
<a name="to-create-a-table-using-the-aws-glue-data-catalog"></a>

1. [https://console.aws.amazon.com/athena/](https://console.aws.amazon.com/athena/home)에서 Athena 콘솔을 엽니다.

1. 쿼리 편집기에서 **테이블 및 뷰(Tables and views)** 옆에 있는 **생성(Create)**을 선택한 다음 **AWS Glue 크롤러(Glue crawler)**를 선택합니다.

1. AWS Glue 콘솔의 **크롤러 추가(Add crawler)** 페이지에 있는 단계에 따라 크롤러를 추가합니다.

   자세한 내용은 [크롤러를 사용하여 테이블 추가](schema-crawlers.md) 섹션을 참조하세요.

## Athena 테이블 생성 양식을 사용하여 테이블 생성
<a name="to-create-a-table-using-the-wizard"></a>

1. [https://console.aws.amazon.com/athena/](https://console.aws.amazon.com/athena/home)에서 Athena 콘솔을 엽니다.

1. 쿼리 편집기에서 **테이블 및 뷰(Tables and views)** 옆에 있는 **생성(Create)**을 선택한 다음 **S3 버킷 데이터(S3 bucket data)**를 선택합니다.

1. **S3 버킷 데이터에서 테이블 생성(Create Table From S3 bucket data)** 양식에 테이블 생성을 위한 정보를 입력한 다음 **테이블 생성(Create table)**을 선택합니다. 양식의 필드에 대한 자세한 내용은 [Athena 콘솔의 양식을 사용하여 AWS Glue 테이블 추가](data-sources-glue-manual-table.md) 섹션을 참조하세요.

## Athena 쿼리 편집기에서 CREATE TABLE 문을 사용하여 테이블을 생성하려면
<a name="to-create-a-table-using-hive-ddl"></a>

1. **Database(데이터베이스)** 메뉴에서 테이블을 생성할 데이터베이스를 선택합니다. `CREATE TABLE` 문에서 데이터베이스를 지정하지 않으면 쿼리 편집기에서 현재 선택되어 있는 데이터베이스에 테이블이 생성됩니다.

1. 쿼리 편집기에서 다음 예제에 표시된 문을 입력한 다음 **실행**을 선택합니다.

   ```
   CREATE EXTERNAL TABLE myopencsvtable (
      firstname string,
      lastname string,
      job string,
      country string
   )
   ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde'
   WITH SERDEPROPERTIES (
      'separatorChar' = ',',
      'quoteChar' = '"',
      'escapeChar' = '\\'
      )
   STORED AS TEXTFILE
   LOCATION 's3://amzn-s3-demo-bucket/mycsv/';
   ```

# Amazon S3의 테이블 위치 지정
<a name="tables-location-format"></a>

Athena에서 `CREATE TABLE` 쿼리를 실행하면 Athena는 메타데이터를 저장하는 AWS Glue 데이터 카탈로그에 테이블을 등록합니다.

Amazon S3의 데이터에 대한 경로를 지정하려면 다음 예제와 같이 `CREATE TABLE` 문에 `LOCATION` 속성을 사용합니다.

```
CREATE EXTERNAL TABLE `test_table`(
...
)
ROW FORMAT ...
STORED AS INPUTFORMAT ...
OUTPUTFORMAT ...
LOCATION s3://amzn-s3-demo-bucket/folder/
```
+ 버킷 이름 지정에 대한 자세한 내용은 *Amazon Simple Storage Service 사용 설명서*의 [버킷 규제 및 제한](https://docs.aws.amazon.com/AmazonS3/latest/dev/BucketRestrictions.html)을 참조하세요.
+ Amazon S3에서의 폴더 사용에 대한 자세한 내용은 *Amazon Simple Storage Service 사용 설명서*의 [폴더 사용](https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-folders.html)을 참조하세요.

Amazon S3의 `LOCATION`은 테이블을 나타내는 *모든* 파일을 지정합니다.

**중요**  
Athena는 지정한 Amazon S3 폴더에 저장된 *모든* 데이터를 읽습니다. Athena가 읽지 *않도록* 할 데이터가 있는 경우 Athena가 읽어야 할 데이터가 있는 Amazon S3 폴더와 동일한 폴더에 해당 데이터를 저장하지 않아야 합니다.

`LOCATION` 문에서 `CREATE TABLE`을 지정하는 경우 다음 지침을 따르세요.
+ 후행 슬래시를 사용하세요.
+ Amazon S3 폴더 또는 Amazon S3 액세스 포인트 별칭에 대한 경로를 사용할 수 있습니다. Amazon S3 액세스 포인트 별칭에 대한 자세한 내용은 *Amazon S3 사용 설명서*의 [액세스 포인트에 버킷 스타일 별칭 사용](https://docs.aws.amazon.com/AmazonS3/latest/userguide/access-points-alias.html)을 참조하세요.

 **다음 사용**:

```
s3://amzn-s3-demo-bucket/folder/
```

```
s3://amzn-s3-demo-bucket-metadata-s3alias/folder/
```

데이터에 대해 `LOCATION`을 지정하는 데 다음 항목을 사용하지 마세요.
+ 파일 위치를 지정할 때 파일 이름, 밑줄, 와일드카드 또는 glob 패턴을 사용하지 마세요.
+ Amazon S3 버킷 경로에 `s3.amazon.com` 등의 전체 HTTP 표기법을 추가하지 마세요.
+ `//`와 같이 경로에서 `S3://amzn-s3-demo-bucket/folder//folder/` 같은 빈 폴더를 사용하지 마세요.
+ 아래와 같은 경로를 사용하지 마세요.

  ```
  s3://amzn-s3-demo-bucket
  s3://amzn-s3-demo-bucket/*
  s3://amzn-s3-demo-bucket/mySpecialFile.dat
  s3://amzn-s3-demo-bucket/prefix/filename.csv
  s3://amzn-s3-demo-bucket.s3.amazon.com
  S3://amzn-s3-demo-bucket/prefix//prefix/
  arn:aws:s3:::amzn-s3-demo-bucket/prefix
  s3://arn:aws:s3:<region>:<account_id>:accesspoint/<accesspointname>
  https://<accesspointname>-<number>.s3-accesspoint.<region>.amazonaws.com
  ```

# 테이블 생성 후 테이블 정보 표시
<a name="creating-tables-showing-table-information"></a>

Athena에서 테이블을 생성하면 해당 이름이 Athena 콘솔의 왼쪽에 있는 **테이블(Tables)** 목록에 표시됩니다. 테이블에 대한 정보를 표시하고 관리하려면 Athena 콘솔에서 테이블 이름 옆에 있는 세로 점 3개를 선택합니다.
+ **테이블 미리 보기** - Athena 쿼리 편집기에서 `SELECT * FROM "database_name"."table_name" LIMIT 10` 문을 실행하여 모든 열의 첫 10개 행을 표시합니다.
+ **테이블 DDL 생성** - Athena 쿼리 편집기에서 `SHOW CREATE TABLE` *table\$1name* 문을 실행하여 테이블을 다시 생성하는 데 사용할 수 있는 DDL 문을 생성합니다.
+ **파티션 로드** - Athena 쿼리 편집기에서 `MSCK REPAIR TABLE table_name` 문이 실행됩니다. 이 옵션은 테이블에 파티션이 있는 경우에만 사용할 수 있습니다.
+ **편집기에 삽입** - 현재 편집 위치의 쿼리 편집기에 테이블 이름을 삽입합니다.
+ **테이블 삭제** - 테이블을 삭제할지 묻는 확인 대화 상자를 표시합니다. 동의하면 Athena 쿼리 편집기에서 `DROP TABLE table_name` 문이 실행됩니다.
+ **테이블 속성** - 테이블 이름, 데이터베이스 이름, 생성 시간 및 테이블에 암호화된 데이터가 있는지 여부를 표시합니다.