

# DDL 문
<a name="ddl-reference"></a>

Athena에서 직접 제공되는 지원되는 데이터 정의 언어(DDL) 문을 사용합니다. Athena 쿼리 엔진은 부분적으로 [HiveQL DDL](https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL)을 기반으로 합니다. Athena는 모든 DDL 설명을 지원하지는 않으며, HiveQL DDL과 Athena DDL 간에는 일부 차이점이 있습니다. 자세한 내용은 이 단원의 참조 주제 및 [지원되지 않는 DDL](unsupported-ddl.md)을(를) 참조하세요.

**Topics**
+ [지원되지 않는 DDL](unsupported-ddl.md)
+ [ALTER DATABASE SET DBPROPERTIES](alter-database-set-dbproperties.md)
+ [ALTER TABLE ADD COLUMNS](alter-table-add-columns.md)
+ [ALTER TABLE ADD PARTITION](alter-table-add-partition.md)
+ [ALTER TABLE CHANGE COLUMN](alter-table-change-column.md)
+ [ALTER TABLE DROP PARTITION](alter-table-drop-partition.md)
+ [ALTER TABLE RENAME PARTITION](alter-table-rename-partition.md)
+ [ALTER TABLE REPLACE COLUMNS](alter-table-replace-columns.md)
+ [ALTER TABLE SET LOCATION](alter-table-set-location.md)
+ [ALTER TABLE SET TBLPROPERTIES](alter-table-set-tblproperties.md)
+ [ALTER VIEW DIALECT](alter-view-dialect.md)
+ [CREATE DATABASE](create-database.md)
+ [CREATE TABLE](create-table.md)
+ [CREATE TABLE AS](create-table-as.md)
+ [CREATE VIEW](create-view.md)
+ [DESCRIBE](describe-table.md)
+ [DESCRIBE VIEW](describe-view.md)
+ [DROP DATABASE](drop-database.md)
+ [DROP TABLE](drop-table.md)
+ [DROP VIEW](drop-view.md)
+ [MSCK REPAIR TABLE](msck-repair-table.md)
+ [SHOW COLUMNS](show-columns.md)
+ [SHOW CREATE TABLE](show-create-table.md)
+ [SHOW CREATE VIEW](show-create-view.md)
+ [SHOW DATABASES](show-databases.md)
+ [SHOW PARTITIONS](show-partitions.md)
+ [SHOW TABLES](show-tables.md)
+ [SHOW TBLPROPERTIES](show-tblproperties.md)
+ [SHOW VIEWS](show-views.md)

# 지원되지 않는 DDL
<a name="unsupported-ddl"></a>

다음 DDL 문은 Athena SQL에서 지원되지 않습니다. Athena의 Iceberg 테이블에 지원되는 DDL 문은 [Iceberg 테이블 스키마 개선](querying-iceberg-evolving-table-schema.md) 및 [Iceberg 테이블에서 다른 DDL 작업 수행](querying-iceberg-additional-operations.md) 섹션을 참조하세요.
+ ALTER INDEX
+ ALTER TABLE *table\$1name* ARCHIVE PARTITION
+ ALTER TABLE *table\$1name* CLUSTERED BY
+ ALTER TABLE *table\$1name* DROP COLUMN(Iceberg 테이블에 지원됨)
+ ALTER TABLE *table\$1name* EXCHANGE PARTITION
+ ALTER TABLE *table\$1name* NOT CLUSTERED
+ ALTER TABLE *table\$1name* NOT SKEWED
+ ALTER TABLE *table\$1name* NOT SORTED
+ ALTER TABLE *table\$1name* NOT STORED AS DIRECTORIES
+ ALTER TABLE *table\$1name* partitionSpec CHANGE COLUMNS
+ ALTER TABLE *table\$1name* partitionSpec COMPACT
+ ALTER TABLE *table\$1name* partitionSpec CONCATENATE
+ ALTER TABLE *table\$1name* partitionSpec SET FILEFORMAT
+ ALTER TABLE *table\$1name* RENAME TO(Iceberg 테이블에 지원됨)
+ ALTER TABLE *table\$1name* SET SERDEPROPERTIES
+ ALTER TABLE *table\$1name* SET SKEWED LOCATION
+ ALTER TABLE *table\$1name* SKEWED BY
+ ALTER TABLE *table\$1name* TOUCH
+ ALTER TABLE *table\$1name* UNARCHIVE PARTITION
+ COMMIT
+ CREATE INDEX
+ 역할 생성
+ CREATE TABLE *table\$1name* LIKE *existing\$1table\$1name* 
+ CREATE TEMPORARY MACRO
+ DELETE FROM
+ DESCRIBE DATABASE
+ DFS
+ DROP INDEX
+ DROP ROLE
+ DROP TEMPORARY MACRO
+ EXPORT TABLE
+ GRANT ROLE
+ IMPORT TABLE
+ LOCK DATABASE
+ LOCK TABLE
+ REVOKE ROLE
+ ROLLBACK
+ SHOW COMPACTIONS
+ SHOW CURRENT ROLES
+ SHOW GRANT
+ SHOW INDEXES
+ SHOW LOCKS
+ SHOW PRINCIPALS
+ SHOW ROLE GRANT
+ SHOW ROLES
+ SHOW STATS
+ SHOW TRANSACTIONS
+ START TRANSACTION
+ UNLOCK DATABASE
+ UNLOCK TABLE

# ALTER DATABASE SET DBPROPERTIES
<a name="alter-database-set-dbproperties"></a>

데이터베이스에 대해 하나 이상의 속성을 생성합니다. `DATABASE`와 `SCHEMA`는 동일하게 사용됩니다. 두 용어의 의미는 동일합니다.

## 시놉시스
<a name="synopsis"></a>

```
ALTER {DATABASE|SCHEMA} database_name
  SET DBPROPERTIES ('property_name'='property_value' [, ...] )
```

## 파라미터
<a name="parameters"></a>

**SET DBPROPERTIES ('property\$1name'='property\$1value' [, ...]**  
`property_name`이라는 데이터베이스에 속성을 지정하고, 속성의 값을 각각 `property_value`로 설정합니다. `property_name`이 이미 존재하면 이전 값이 `property_value`로 재설정됩니다.

## 예제
<a name="examples"></a>

```
ALTER DATABASE jd_datasets
  SET DBPROPERTIES ('creator'='John Doe', 'department'='applied mathematics');
```

```
ALTER SCHEMA jd_datasets
  SET DBPROPERTIES ('creator'='Jane Doe');
```

# ALTER TABLE ADD COLUMNS
<a name="alter-table-add-columns"></a>

기존 테이블에 하나 이상의 열을 추가합니다. 선택적 `PARTITION` 구문을 사용할 때 파티션 메타데이터를 업데이트합니다.

## 시놉시스
<a name="synopsis"></a>

```
ALTER TABLE table_name 
  [PARTITION 
   (partition_col1_name = partition_col1_value
   [,partition_col2_name = partition_col2_value][,...])]
  ADD COLUMNS (col_name data_type)
```

## 파라미터
<a name="parameters"></a>

**PARTITION (partition\$1col\$1name = partition\$1col\$1value [,...])**  
지정한 열 이름/값 조합으로 파티션을 생성합니다. 열의 데이터 형식이 문자열인 경우에만 인용 부호로 `partition_col_value`를 묶습니다.

**ADD COLUMNS (col\$1name data\$1type [,col\$1name data\$1type,...])**  
기존 열 뒤에(즉, 파티션 열 앞에) 열을 추가합니다.

## 예시
<a name="examples"></a>

```
ALTER TABLE events ADD COLUMNS (eventowner string)
```

```
ALTER TABLE events PARTITION (awsregion='us-west-2') ADD COLUMNS (event string)
```

```
ALTER TABLE events PARTITION (awsregion='us-west-2') ADD COLUMNS (eventdescription string)
```

## 참고
<a name="alter-table-add-columns-notes"></a>
+ `ALTER TABLE ADD COLUMNS`를 실행한 후 Athena 쿼리 편집기 탐색 창에서 새 테이블 열을 보려면 편집기에서 테이블 목록을 수동으로 새로 고친 다음 테이블을 다시 확장합니다.
+ `ALTER TABLE ADD COLUMNS`는 `date` 데이터 형식을 가진 열에 대해 작동하지 않습니다. 이 문제를 해결하려면 `timestamp` 데이터 형식을 대신 사용하세요.

# ALTER TABLE ADD PARTITION
<a name="alter-table-add-partition"></a>

테이블에 대해 하나 이상의 파티션 열을 만듭니다. 각 파티션은 하나 이상의 개별 열 이름/값 조합으로 구성됩니다. 지정된 각각의 조합에 별개의 데이터 디렉터리가 생성되어 상황에 따라 쿼리 성능을 개선할 수 있습니다. 분할된 열은 테이블 데이터 자체 내에 존재하지 않으므로 테이블 자체의 열과 이름이 같은 열 이름을 사용하면 오류가 발생합니다. 자세한 내용은 [데이터 파티셔닝](partitions.md) 섹션을 참조하세요.

Athena에서 테이블과 그 파티션은 동일한 데이터 형식을 사용해야 하지만 스키마는 다를 수 있습니다. 자세한 내용은 [파티션이 있는 테이블의 업데이트](updates-and-partitions.md) 단원을 참조하세요.

IAM 정책에 필요한 리소스 수준 권한(`glue:CreatePartition` 등)에 대한 자세한 내용은 [AWS Glue API 권한: 작업 및 리소스 참조](https://docs.aws.amazon.com/glue/latest/dg/api-permissions-reference.html) 및 [AWS Glue Data Catalog의 데이터베이스 및 테이블에 대한 액세스 구성](fine-grained-access-to-glue-resources.md) 섹션을 참조하세요. Athena 사용 시의 권한에 대한 문제 해결 정보는 [권한](troubleshooting-athena.md#troubleshooting-athena-permissions) 주제의 [Athena의 문제 해결](troubleshooting-athena.md) 섹션을 참조하세요.

## 시놉시스
<a name="synopsis"></a>

```
ALTER TABLE table_name ADD [IF NOT EXISTS]
  PARTITION
  (partition_col1_name = partition_col1_value
  [,partition_col2_name = partition_col2_value]
  [,...])
  [LOCATION 'location1']
  [PARTITION
  (partition_colA_name = partition_colA_value
  [,partition_colB_name = partition_colB_value
  [,...])]
  [LOCATION 'location2']
  [,...]
```

## 파라미터
<a name="parameters"></a>

파티션을 추가할 때 파티션에 대해 하나 이상의 열 이름/값 페어와 해당 파티션의 데이터 파일이 있는 Amazon S3 경로를 지정합니다.

**[IF NOT EXISTS]**  
동일한 정의의 파티션이 이미 있으면 오류가 억제되도록 합니다.

**PARTITION (partition\$1col\$1name = partition\$1col\$1value [,...])**  
지정한 열 이름/값 조합으로 파티션을 생성합니다. 열의 데이터 형식이 문자열인 경우에만 `partition_col_value`를 문자열 문자로 묶습니다.

**[LOCATION 'location']**  
위의 명령문에서 정의한 파티션을 저장할 디렉터리를 지정합니다. 데이터가 Hive 스타일 파티셔닝(`pk1=v1/pk2=v2/pk3=v3`)을 사용하는 경우 `LOCATION` 절은 선택 사항입니다. Hive 스타일 파티셔닝을 사용하면 전체 Amazon S3 URI가 테이블 위치, 파티션 키 이름 및 파티션 키 값을 기반으로 자동으로 구성됩니다. 자세한 내용은 [데이터 파티셔닝](partitions.md) 섹션을 참조하세요.

## 고려 사항
<a name="alter-table-add-partition-considerations"></a>

Amazon Athena는 단일 `ALTER TABLE ADD PARTITION` DDL 문에 추가할 수 있는 파티션 수에 제한을 두지 않습니다. 하지만 상당한 수의 파티션을 추가해야 하는 경우 잠재적인 성능 문제를 방지하기 위해 작업을 더 작은 배치로 나누는 것을 고려해야 합니다. 다음 예제에서는 연속 명령을 사용하여 파티션을 개별적으로 추가하고 중복된 파티션을 추가하지 않도록 `IF NOT EXISTS`를 사용합니다.

```
ALTER TABLE table_name ADD IF NOT EXISTS PARTITION (ds='2023-01-01')
ALTER TABLE table_name ADD IF NOT EXISTS PARTITION (ds='2023-01-02')
ALTER TABLE table_name ADD IF NOT EXISTS PARTITION (ds='2023-01-03')
```

 Athena에서 파티션을 사용할 때 다음 사항에 유의하세요.
+ Athena는 1천만 개의 파티션이 있는 AWS Glue 테이블에 대한 쿼리를 지원하지만, 단일 스캔으로 1백만 개 이상의 파티션을 읽을 수는 없습니다.
+ 쿼리를 최적화하고 스캔되는 파티션 수를 줄이려면 파티션 정리 또는 파티션 인덱스 사용과 같은 전략을 고려해 보세요.

Athena에서의 파티션 사용에 대한 추가 고려 사항은 [데이터 파티셔닝](partitions.md) 섹션을 참조하세요.

## 예제
<a name="examples"></a>

다음 예제는 Hive 스타일로 파티셔닝된 데이터의 테이블에 단일 파티션을 추가합니다.

```
ALTER TABLE orders ADD
  PARTITION (dt = '2016-05-14', country = 'IN');
```

다음 예제는 Hive 스타일로 파티셔닝된 데이터의 테이블에 다중 파티션을 추가합니다.

```
ALTER TABLE orders ADD
  PARTITION (dt = '2016-05-31', country = 'IN')
  PARTITION (dt = '2016-06-01', country = 'IN');
```

테이블이 Hive 스타일로 파티셔닝된 데이터를 지원하지 않는 경우 `LOCATION` 절은 필수이며, 파티션의 데이터를 포함하는 접두사에 대해 전체 Amazon S3 URI여야 합니다.

```
ALTER TABLE orders ADD
  PARTITION (dt = '2016-05-31', country = 'IN') LOCATION 's3://amzn-s3-demo-bucket/path/to/INDIA_31_May_2016/'
  PARTITION (dt = '2016-06-01', country = 'IN') LOCATION 's3://amzn-s3-demo-bucket/path/to/INDIA_01_June_2016/';
```

파티션이 이미 존재하는 경우 오류를 무시하려면 다음 예제와 같이 `IF NOT EXISTS` 절을 사용합니다.

```
ALTER TABLE orders ADD IF NOT EXISTS
  PARTITION (dt = '2016-05-14', country = 'IN');
```

## 0바이트 `_$folder$` 파일
<a name="alter-table-add-partition-zero-byte-folder-files"></a>

`ALTER TABLE ADD PARTITION` 문을 실행할 때 이미 존재하는 파티션과 잘못된 Amazon S3 위치를 지정하는 경우 Amazon S3에 `partition_value_$folder$` 형식의 0바이트 자리 표시자 파일이 생성됩니다. 이러한 파일은 수동으로 제거해야 합니다.

이 오류가 발생하지 않도록 하려면 다음 예제와 같이 `ALTER TABLE ADD PARTITION` 문에서 `ADD IF NOT EXISTS` 구문을 사용합니다.

```
ALTER TABLE table_name ADD IF NOT EXISTS PARTITION […]
```

# ALTER TABLE CHANGE COLUMN
<a name="alter-table-change-column"></a>

테이블의 열에 대한 이름, 유형, 순서 또는 설명을 변경합니다.

## 시놉시스
<a name="alter-table-change-column-synopsis"></a>

```
ALTER TABLE [db_name.]table_name
  CHANGE [COLUMN] col_old_name col_new_name column_type 
  [COMMENT col_comment] [FIRST|AFTER column_name]
```

## 예시
<a name="alter-table-change-column-example"></a>

다음 예제에서는 열 이름을 `area`에서 `zip`(으)로 변경하고, 데이터 유형 정수를 만든 후 이름이 변경된 열을 `id` 열 뒤에 배치합니다.

```
ALTER TABLE example_table CHANGE COLUMN area zip int AFTER id
```

다음 예제에서는 `example_table`에 대한 메타데이터의 `zip` 열에 주석을 추가합니다. 주석을 보려면 AWS CLI [https://awscli.amazonaws.com/v2/documentation/api/latest/reference/athena/get-table-metadata.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/athena/get-table-metadata.html) 명령을 사용하거나 AWS Glue 콘솔의 테이블에 대한 스키마를 방문하십시오.

```
ALTER TABLE example_table CHANGE COLUMN zip zip int COMMENT 'USA zipcode'
```

# ALTER TABLE DROP PARTITION
<a name="alter-table-drop-partition"></a>

명명된 테이블에 지정된 하나 이상의 파티션을 삭제합니다.

## 시놉시스
<a name="synopsis"></a>

```
ALTER TABLE table_name DROP [IF EXISTS] PARTITION (partition_spec) [, PARTITION (partition_spec)]
```

## 파라미터
<a name="alter-table-drop-partition-parameters"></a>

**[IF EXISTS]**  
지정된 파티션이 없는 경우 오류 메시지를 억제합니다.

**PARTITION (partition\$1spec)**  
각각의 `partition_spec`은(는) `partition_col_name = partition_col_value [,...]` 형식으로 열 이름/값 조합을 지정합니다.

## 예제
<a name="alter-table-drop-partition-examples"></a>

```
ALTER TABLE orders 
DROP PARTITION (dt = '2014-05-14', country = 'IN');
```

```
ALTER TABLE orders 
DROP PARTITION (dt = '2014-05-14', country = 'IN'), PARTITION (dt = '2014-05-15', country = 'IN');
```

## 참고
<a name="alter-table-drop-partition-notes"></a>

`ALTER TABLE DROP PARTITION` 문은 한 번에 모든 파티션을 삭제하기 위한 단일 구문을 제공하지 않으며 삭제할 파티션 범위를 지정하는 필터링 기준을 지원하지 않습니다.

차선책으로, AWS Glue API [GetPartitions](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-api-catalog-partitions.html#aws-glue-api-catalog-partitions-GetPartitions) 및 [BatchDeletePartition](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-api-catalog-partitions.html#aws-glue-api-catalog-partitions-BatchDeletePartition) 작업을 스크립팅에 사용할 수 있습니다. `GetPartitions` 작업은 SQL `WHERE` 표현식과 같은 복잡한 필터 표현식을 지원합니다. `GetPartitions`를 사용하여 삭제할 파티션의 필터링된 목록을 만들려면, `BatchDeletePartition` 작업을 사용하여 25개 단위의 배치로 파티션을 삭제할 수 있습니다.

# ALTER TABLE RENAME PARTITION
<a name="alter-table-rename-partition"></a>

파티션 값의 이름을 바꿉니다.

**참고**  
ALTER TABLE RENAME PARTITION은 파티션 열의 이름을 바꾸지 않습니다. AWS Glue 콘솔을 사용하여 파티션 열 이름을 변경할 수 있습니다. 자세한 내용은 이 문서의 후반부에서 [AWS Glue의 파티션 열 이름 바꾸기](#alter-table-rename-partition-column-name) 단원을 참조하세요.

## 시놉시스
<a name="synopsis"></a>

이름이 `table_name`인 테이블의 경우 `partition_spec`으로 지정된 파티션 값을 `new_partition_spec`에서 지정한 값으로 이름을 바꿉니다.

```
ALTER TABLE table_name PARTITION (partition_spec) RENAME TO PARTITION (new_partition_spec)
```

## 파라미터
<a name="parameters"></a>

**PARTITION (partition\$1spec)**  
각각의 `partition_spec`은(는) `partition_col_name = partition_col_value [,...]` 형식으로 열 이름/값 조합을 지정합니다.

## 예제
<a name="examples"></a>

```
ALTER TABLE orders 
PARTITION (dt = '2014-05-14', country = 'IN') RENAME TO PARTITION (dt = '2014-05-15', country = 'IN');
```

## AWS Glue의 파티션 열 이름 바꾸기
<a name="alter-table-rename-partition-column-name"></a>

AWS Glue 콘솔에서 파티션 열 이름을 바꾸려면 다음 절차를 사용하세요.

**AWS Glue 콘솔에서 테이블 파티션 열의 이름 바꾸기**

1. AWS Management Console에 로그인하여 [https://console.aws.amazon.com/glue/](https://console.aws.amazon.com/glue/)에서 AWS Glue 콘솔을 엽니다.

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

1. **테이블** 페이지에서 **테이블 필터링** 검색 상자를 사용하여 변경하려는 테이블을 찾을 수 있습니다.

1. **이름** 열에서 변경하려는 테이블의 링크를 선택합니다.

1. **스키마** 섹션의 테이블 세부 정보 페이지에서 다음 절차 중 하나를 수행하세요.
   + 이름을 JSON 형식으로 바꾸려면 **스키마를 JSON으로 편집**을 선택합니다.
   + 이름을 직접 변경하려면 **스키마 편집**을 선택합니다. 이 절차에서는 **스키마 편집**을 선택합니다.

1. 이름을 바꾸려는 분할된 열의 확인란을 선택한 다음 **편집**을 클릭합니다.

1. **스키마 항목 편집** 대화 상자의 **이름**에 파티션 열의 새 이름을 입력합니다.

1. **새 테이블 버전으로 저장**을 선택합니다. 이 작업을 수행하면 파티션 열 이름이 업데이트되고 데이터의 물리적 사본을 별도로 만들지 않고도 스키마 변경 기록이 보존됩니다.

1. 테이블 버전을 비교하려면 테이블의 세부 정보 페이지에서 **작업**을 선택한 다음 **버전 비교**를 선택합니다.

## 추가 리소스
<a name="alter-table-rename-partition-additional-resources"></a>

 파티셔닝에 대한 자세한 내용은 [데이터 파티셔닝](partitions.md) 섹션을 참조하세요.

# ALTER TABLE REPLACE COLUMNS
<a name="alter-table-replace-columns"></a>

[LazySimpleSerDe](lazy-simple-serde.md)로 생성된 테이블에서 모든 열을 제거하고 지정된 열 집합으로 대체합니다. 선택적 `PARTITION` 구문을 사용할 때 파티션 메타데이터를 업데이트합니다. `ALTER TABLE REPLACE COLUMNS`를 사용하여 유지하려는 열만 지정해 열을 삭제할 수도 있습니다.

## 시놉시스
<a name="synopsis"></a>

```
ALTER TABLE table_name 
  [PARTITION 
   (partition_col1_name = partition_col1_value
   [,partition_col2_name = partition_col2_value][,...])]
  REPLACE COLUMNS (col_name data_type [, col_name data_type, ...])
```

## 파라미터
<a name="parameters"></a>

**PARTITION (partition\$1col\$1name = partition\$1col\$1value [,...])**  
지정한 열 이름/값 조합으로 파티션을 지정합니다. 열의 데이터 형식이 문자열인 경우에만 인용 부호로 `partition_col_value`를 묶습니다.

**REPLACE COLUMNS (col\$1name data\$1type [,col\$1name data\$1type,...])**  
기존 열을 지정된 열 이름 및 데이터 유형으로 바꿉니다.

## 참고
<a name="alter-table-replace-columns-notes"></a>
+ `ALTER TABLE REPLACE COLUMNS` 실행 후 Athena 쿼리 편집기 탐색 창에서 테이블 열의 변경을 확인하려면 편집기의 테이블 목록을 수동으로 새로 고친 다음 테이블을 다시 확장해야 할 수 있습니다.
+ `ALTER TABLE REPLACE COLUMNS`는 `date` 데이터 형식을 가진 열에 대해 작동하지 않습니다. 이 문제를 해결하려면 테이블에서 `timestamp` 데이터 형식을 대신 사용하세요.
+ 단 하나의 열만 바꾸는 경우에도 구문은 `ALTER TABLE table-name REPLACE COLUMNS`와 같이 *columns*가 복수형이어야 합니다. 바꾸려는 열뿐만 아니라 유지하려는 열도 지정해야 합니다. 그렇지 않으면 지정하지 않은 열이 삭제됩니다. 이 구문과 동작은 Apache Hive DDL에서 파생됩니다. Apache 설명서에서 [열 추가/바꾸기](https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL#LanguageManualDDL-Add/ReplaceColumns)를 참조하세요.

## 예제
<a name="alter-table-replace-columns-example"></a>

다음 예에서 [LazySimpleSerDe](lazy-simple-serde.md)를 사용하여 만든 테이블 `names_cities`에는 `col1`, `col2` 및 `col3`이라는 세 개의 열이 있습니다. 모든 열은 `string` 형식입니다. 테이블의 열을 표시하기 위해 다음 명령에서는 [SHOW COLUMNS](show-columns.md) 문을 사용합니다.

```
SHOW COLUMNS IN names_cities
```

쿼리의 결과:

```
col1
col2
col3
```

다음 `ALTER TABLE REPLACE COLUMNS` 명령은 열 이름을 `first_name`, `last_name` 및 `city`로 바꿉니다. 기본 소스 데이터는 영향을 받지 않습니다.

```
ALTER TABLE names_cities
REPLACE COLUMNS (first_name string, last_name string, city string)
```

결과를 테스트하기 위해 `SHOW COLUMNS`를 다시 실행합니다.

```
SHOW COLUMNS IN names_cities
```

쿼리의 결과:

```
first_name
last_name
city
```

새 열 이름을 표시하는 또 다른 방법은 Athena 쿼리 편집기에서 [표를 미리 보거나](creating-tables-showing-table-information.md) 자체 `SELECT` 쿼리를 실행하는 것입니다.

# ALTER TABLE SET LOCATION
<a name="alter-table-set-location"></a>

`table_name`이라는 테이블의 위치를 변경하고, 선택적으로 `partition_spec`인 파티션을 변경합니다.

## 시놉시스
<a name="synopsis"></a>

```
ALTER TABLE table_name [ PARTITION (partition_spec) ] SET LOCATION 'new location'
```

## 파라미터
<a name="alter-table-set-location-parameters"></a>

**PARTITION (partition\$1spec)**  
`partition_spec` 파라미터로 위치를 변경하고자 하는 파티션을 지정합니다. `partition_spec`은 `partition_col_name = partition_col_value` 형식으로 열 이름/값 조합을 지정합니다.

**SET LOCATION '새 위치'**  
새 위치를 지정합니다. 이 때 위치는 Amazon S3 위치여야 합니다. 구문에 대한 자세한 내용은 [Amazon S3에서의 테이블 위치](tables-location-format.md)를 참조하세요.

## 예시
<a name="alter-table-set-location-examples"></a>

```
ALTER TABLE customers PARTITION (zip='98040', state='WA') SET LOCATION 's3://amzn-s3-demo-bucket/custdata/';
```

# ALTER TABLE SET TBLPROPERTIES
<a name="alter-table-set-tblproperties"></a>

테이블에 사용자 지정 또는 미리 정의된 메타데이터 속성을 추가하고 할당된 값을 설정합니다. 테이블의 속성을 보려면 [SHOW TBLPROPERTIES](show-tblproperties.md) 명령을 사용합니다.

Apache Hive [관리형 테이블](https://cwiki.apache.org/confluence/display/Hive/Managed+vs.+External+Tables)이 지원되지 않으므로 `'EXTERNAL'='FALSE'` 설정은 효과가 없습니다.

## 시놉시스
<a name="synopsis"></a>

```
ALTER TABLE table_name SET TBLPROPERTIES ('property_name' = 'property_value' [ , ... ])
```

## 파라미터
<a name="parameters"></a>

**SET TBLPROPERTIES ('property\$1name' = 'property\$1value' [ , ... ])**  
추가할 메타데이터 속성을 `property_name`으로 지정하고 각각의 값을 `property value`로 지정합니다. `property_name`이 이미 존재하는 경우, 해당 값은 새로 지정된 `property_value`로 설정됩니다.  
다음의 미리 정의된 테이블 속성은 특별한 용도로 사용됩니다.    
****    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/athena/latest/ug/alter-table-set-tblproperties.html)

## 예제
<a name="examples"></a>

다음 예제에서는 테이블 속성에 주석 메모를 추가합니다.

```
ALTER TABLE orders 
SET TBLPROPERTIES ('notes'="Please don't drop this table.");
```

다음 예제에서는 ZSTD 압축 및 ZSTD 압축 수준 4와 함께 Parquet 파일 형식을 사용하도록 테이블 `existing_table`을 수정합니다.

```
ALTER TABLE existing_table 
SET TBLPROPERTIES ('parquet.compression' = 'ZSTD', 'compression_level' = 4)
```

# ALTER VIEW DIALECT
<a name="alter-view-dialect"></a>

AWS Glue Data Catalog 뷰에서 엔진 언어를 추가하거나 삭제합니다. AWS Glue Data Catalog 뷰에만 적용됩니다. `Lake Formation` 관리자 또는 정의자 권한이 필요합니다.

AWS Glue Data Catalog 뷰에 대한 자세한 내용은 [Athena에서 Data Catalog 뷰 사용](views-glue.md) 섹션을 참조하세요.

## 구문
<a name="alter-view-dialect-syntax"></a>

```
ALTER VIEW name [ FORCE ] [ ADD|UPDATE ] DIALECT AS query
```

```
ALTER VIEW name [ DROP ] DIALECT
```

**FORCE**  
`FORCE` 키워드는 뷰에서 충돌하는 엔진 언어 정보를 새 정의로 덮어쓰게 합니다. `FORCE` 키워드는 Data Catalog 뷰를 업데이트하여 기존 엔진 언어 간에 뷰 정의가 충돌하는 경우에 유용합니다. Data Catalog 뷰에 Athena 언어와 Amazon Redshift 언어가 모두 있고 업데이트로 인해 보기 정의에서 Amazon Redshift와 충돌이 발생한다고 가정해 보겠습니다. 이 경우 `FORCE` 키워드를 사용하여 업데이트를 완료하고 Amazon Redshift 언어를 기한 경과로 표시할 수 있습니다. 기한 경과로 표시된 엔진이 뷰를 쿼리하면 쿼리가 실패합니다. 엔진에서 예외를 발생시켜 기한 경과 결과를 허용하지 않습니다. 이 문제를 해결하려면 뷰에서 기한 경과 언어를 업데이트합니다.

**ADD**  
Data Catalog 뷰에 새 엔진 언어를 추가합니다. 지정된 엔진이 Data Catalog 뷰에 이미 존재해서는 안 됩니다.

**UPDATE**  
Data Catalog 뷰에 이미 존재하는 엔진 언어를 업데이트합니다.

**DROP**  
Data Catalog 뷰에서 기존 엔진 언어를 삭제합니다. Data Catalog 뷰에서 엔진을 삭제한 후에는 삭제된 엔진에서 Data Catalog 뷰를 쿼리할 수 없습니다. 뷰의 다른 엔진 언어는 여전히 뷰를 쿼리할 수 있습니다.

**DIALECT AS**  
엔진별 SQL 쿼리를 소개합니다.

## 예시
<a name="alter-view-dialect-syntax-examples"></a>

```
ALTER VIEW orders_by_date FORCE ADD DIALECT 
AS 
SELECT orderdate, sum(totalprice) AS price 
FROM orders 
GROUP BY orderdate
```

```
ALTER VIEW orders_by_date FORCE UPDATE DIALECT 
AS 
SELECT orderdate, sum(totalprice) AS price 
FROM orders 
GROUP BY orderdate
```

```
ALTER VIEW orders_by_date DROP DIALECT
```

# CREATE DATABASE
<a name="create-database"></a>

데이터베이스를 생성합니다. `DATABASE`와 `SCHEMA`는 동일한 의미로 통용됩니다. 두 용어의 의미는 동일합니다.

**참고**  
데이터베이스 생성, 테이블 생성 및 Athena의 테이블에서 `SELECT` 쿼리 실행에 대한 예제는 [시작하기](getting-started.md) 항목을 참조하세요.

## 시놉시스
<a name="synopsis"></a>

```
CREATE {DATABASE|SCHEMA} [IF NOT EXISTS] database_name
  [COMMENT 'database_comment']
  [LOCATION 'S3_loc']
  [WITH DBPROPERTIES ('property_name' = 'property_value') [, ...]]
```

Athena의 데이터베이스 이름에 대한 제한 사항은 [이름 데이터베이스, 테이블 및 열](tables-databases-columns-names.md) 섹션을 참조하세요.

## 파라미터
<a name="parameters"></a>

**[IF NOT EXISTS]**  
`database_name`이라는 데이터베이스가 이미 있으면 오류가 억제되도록 합니다.

**[COMMENT database\$1comment]**  
`comment`라는 내장 메타데이터 속성의 메타데이터 값과 `database_comment`에 입력하는 값을 설정합니다. AWS Glue에서 `COMMENT` 콘텐츠는 데이터베이스 속성의 `Description` 필드에 작성됩니다.

**[LOCATION S3\$1loc]**  
데이터베이스 파일과 메타 스토어가 존재할 위치를 `S3_loc`로 지정합니다. 이 위치는 Amazon S3 위치여야 합니다.

**[WITH DBPROPERTIES ('property\$1name' = 'property\$1value') [, ...] ]**  
데이터베이스 정의에 사용자 지정 메타데이터 속성을 지정할 수 있습니다.

## 예시
<a name="examples"></a>

```
CREATE DATABASE clickstreams;
```

```
CREATE DATABASE IF NOT EXISTS clickstreams
  COMMENT 'Site Foo clickstream data aggregates'
  LOCATION 's3://amzn-s3-demo-bucket/clickstreams/'
  WITH DBPROPERTIES ('creator'='Jane D.', 'Dept.'='Marketing analytics');
```

## 데이터베이스 속성 보기
<a name="create-database-viewing-properties"></a>

`CREATE DATABASE`를 사용해 AWSDataCatalog에 생성한 데이터베이스의 데이터베이스 속성을 보려면 다음 예시처럼 AWS CLI 명령 [https://awscli.amazonaws.com/v2/documentation/api/latest/reference/glue/get-database.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/glue/get-database.html)를 사용합니다.

```
aws glue get-database --name <your-database-name>
```

JSON 출력에서 결과가 다음과 같이 보입니다.

```
{
    "Database": {
        "Name": "<your-database-name>",
        "Description": "<your-database-comment>",
        "LocationUri": "s3://amzn-s3-demo-bucket",
        "Parameters": {
            "<your-database-property-name>": "<your-database-property-value>"
        },
        "CreateTime": 1603383451.0,
        "CreateTableDefaultPermissions": [
            {
                "Principal": {
                    "DataLakePrincipalIdentifier": "IAM_ALLOWED_PRINCIPALS"
                },
                "Permissions": [
                    "ALL"
                ]
            }
        ]
    }
}
```

AWS CLI에 대한 자세한 내용은 [AWS Command Line Interface 사용 설명서](https://docs.aws.amazon.com/cli/latest/userguide/)를 참조하세요.

# CREATE TABLE
<a name="create-table"></a>

지정한 파라미터와 이름으로 테이블을 생성합니다.

**참고**  
이 페이지에는 요약 참조 정보가 포함되어 있습니다. Athena에서 테이블을 생성하는 방법과 예제 `CREATE TABLE` 문에 대한 자세한 내용은 [Athena에서 테이블 생성](creating-tables.md) 단원을 참조하세요. 데이터베이스 생성, 테이블 생성 및 Athena의 테이블에서 `SELECT` 쿼리 실행에 대한 예제는 [시작하기](getting-started.md) 항목을 참조하세요.

## 시놉시스
<a name="synopsis"></a>

```
CREATE EXTERNAL TABLE [IF NOT EXISTS]
 [db_name.]table_name [(col_name data_type [COMMENT col_comment] [, ...] )]
 [COMMENT table_comment]
 [PARTITIONED BY (col_name data_type [COMMENT col_comment], ...)]
 [CLUSTERED BY (col_name, col_name, ...) INTO num_buckets BUCKETS]
 [ROW FORMAT row_format]
 [STORED AS file_format] 
 [WITH SERDEPROPERTIES (...)]
 [LOCATION 's3://amzn-s3-demo-bucket/[folder]/']
 [TBLPROPERTIES ( ['has_encrypted_data'='true | false',] ['encryption_option'='SSE_S3 | SSE_KMS | CSE_KMS',] ['kms_key'='aws_kms_key_arn',] ['classification'='aws_glue_classification',] property_name=property_value [, ...] ) ]
```

## 파라미터
<a name="parameters"></a>

**EXTERNAL**  
테이블이 사용자가 지정한 `LOCATION`의 Amazon S3에 있는 기본 데이터 파일을 기반으로 하도록 지정합니다. [Iceberg](querying-iceberg-creating-tables.md) 테이블을 생성할 때를 제외하고 항상 `EXTERNAL` 키워드를 사용하세요. Iceberg가 아닌 테이블에 대해 `EXTERNAL` 키워드 없이 `CREATE TABLE`을 사용하는 경우 Athena에서 오류가 발생합니다. 외부 테이블을 만들 때 참조되는 데이터는 기본 형식 또는 `ROW FORMAT`, `STORED AS`, `WITH SERDEPROPERTIES` 절로 지정한 형식을 준수해야 합니다.

**[IF NOT EXISTS]**  
이 파라미터는 동일한 이름의 테이블이 이미 존재하는지 확인합니다. 존재하는 경우 파라미터는 `TRUE`를 반환하고 Amazon Athena는 `CREATE TABLE` 작업을 취소합니다. Athena가 데이터 카탈로그를 직접적으로 호출하기 전에 취소가 발생하므로 AWS CloudTrail 이벤트를 내보내지 않습니다.

**[db\$1name.]table\$1name**  
테이블의 이름이 생성되도록 지정합니다. 옵션 `db_name` 파라미터는 테이블이 있는 데이터베이스를 지정합니다. 생략하면 현재 데이터베이스로 가정됩니다. 테이블 이름에 숫자가 포함되어 있는 경우 `table_name`을 인용 부호로 묶습니다(예: `"table123"`). `table_name`이 밑줄로 시작하는 경우 백틱을 사용합니다(예: ``_mytable``). 밑줄 이외의 특수 문자는 지원되지 않습니다.  
Athena 테이블 이름은 대소문자를 구분하지 않으나 Apache Spark로 작업하는 경우 Spark에는 소문자 테이블 이름이 필요합니다. Athena의 테이블 이름에 대한 제한 사항은 [이름 데이터베이스, 테이블 및 열](tables-databases-columns-names.md) 섹션을 참조하세요.

**[ ( col\$1name data\$1type [COMMENT col\$1comment] [, ...] ) ]**  
열의 데이터 형식과 함께, 작성될 각 열의 이름을 지정합니다. 열 이름은 밑줄 `(_)` 이외의 특수 문자를 허용하지 않습니다. `col_name`이 밑줄로 시작하는 경우 열 이름을 악센트 부호(`)로 묶습니다(예: ``_mycolumn``). Athena의 열 이름에 대한 제한 사항은 [이름 데이터베이스, 테이블 및 열](tables-databases-columns-names.md) 섹션을 참조하세요.  
`data_type` 값은 다음 중 하나일 수 있습니다.  
+ `boolean` – 값은 `true` 및 `false`입니다.
+ `tinyint` - 2의 보수 형식의 부호 있는 8비트 정수이며, 최솟값은 -2^7이고 최댓값은 2^7-1입니다.
+ `smallint` - 2의 보수 형식의 부호 있는 16비트 정수이며, 최솟값은 -2^15이고 최댓값은 2^15-1입니다.
+ `int` - `CREATE TABLE`과 같은 DDL(데이터 정의 언어) 쿼리에서는 `int` 키워드를 사용하여 정수를 나타냅니다. 다른 쿼리에서 키워드 `integer`를 사용합니다. 여기에서 `integer`는 2의 보수 형식의 부호 있는 32비트 값으로 표현되며, 최솟값은 -2^31, 최댓값은 2^31-1입니다. JDBC 드라이버의 경우 비즈니스 분석 애플리케이션과 호환될 수 있도록 `integer`이(가) 반환됩니다.
+ `bigint` - 2의 보수 형식의 부호 있는 64비트 정수이며, 최솟값은 -2^63이고 최댓값은 2^63-1입니다.
+ `double` – 64비트 부호 포함 배정밀도 부동 소수점 숫자입니다. 범위는 4.94065645841246544e-324d \$1 1.79769313486231570e\$1308d, 양수 또는 음수입니다. `double`은 부동 소수점 산술에 대한 IEEE 표준(IEEE 754)을 따릅니다.
+ `float` – 32비트 부호 포함 단정밀도 부동 소수점 숫자입니다. 범위는 1.40129846432481707e-45 \$1 3.40282346638528860e\$138, 양수 또는 음수입니다. `float`는 부동 소수점 산술에 대한 IEEE 표준(IEEE 754)을 따릅니다. Presto의 `real`에 해당합니다. Athena에서는 `CREATE TABLE` 등의 DDL 문에서 `float`을(를) 사용하고, `SELECT CAST` 등의 SQL 함수에서 `real`을(를) 사용합니다. 이 AWS Glue 크롤러는 `float`로 값을 반환하며, Athena는 내부에서 `real` 및 `float` 형식을 번역합니다([2018년 6월 5일](release-notes.md#release-note-2018-06-05) 릴리스 정보 참조).
+ `decimal [ (precision, scale) ]`, 여기에서 `precision`은 총 자릿수이고, `scale`(선택 사항)은 소수부의 자릿수이며, 기본값은 0입니다. 예를 들어 `decimal(11,5)`, `decimal(15)` 형식 정의를 사용합니다. *precision* 최대값은 38이고, *scale* 최대값은 38입니다.

  쿼리 DDL 표현식에서 특정 10진수 값이 있는 행을 선택하는 경우와 같이 10진수 값을 리터럴로 지정하려면 `decimal` 형식 정의를 지정하고, 쿼리에서 10진수 값을 (작은따옴표로 묶인) 리터럴로 나열합니다(예: `decimal_value = decimal '0.12'`).
+ `char` – 길이가 1\$1255자로 지정된 고정 길이 문자 데이터입니다(예: `char(10)`). 자세한 내용은 [CHAR Hive 데이터 형식](https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Types#LanguageManualTypes-char)을 참조하세요.
+ `varchar` – 길이가 1\$165535자로 지정된 가변 길이 문자 데이터입니다(예: `varchar(10)`). 자세한 내용은 [VARCHAR Hive 데이터 형식](https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Types#LanguageManualTypes-varchar)을 참조하세요.
+ `string` – 작은따옴표 또는 큰따옴표로 묶인 문자열 리터럴입니다.
**참고**  
비 문자열 데이터 유형은 Athena에서 `string`으로 캐스팅할 수 없습니다. 대신 `varchar`로 캐스팅합니다.
+ `binary` - (Parquet의 데이터용)
+ `date` – ISO 형식의 날짜(예: `YYYY-MM-DD`)입니다. 예를 들어 `date '2008-09-15'`입니다. 단, OpenCSVSerDe는 예외적으로 1970년 1월 1일 이후 경과된 일 수를 사용합니다. 자세한 내용은 [CSV 처리를 위한 Open CSV SerDe](csv-serde.md) 단원을 참조하세요.
+ `timestamp` – [https://docs.oracle.com/javase/8/docs/api/java/sql/Timestamp.html](https://docs.oracle.com/javase/8/docs/api/java/sql/Timestamp.html) 호환 형식의 날짜 및 시간 인스턴트로, 최대 해상도는 밀리초입니다(예: `yyyy-MM-dd HH:mm:ss[.f...]`). 예를 들어 `timestamp '2008-09-15 03:04:05.324'`입니다. 단, OpenCSVSerDe는 예외적으로 UNIX 숫자 형식의 `TIMESTAMP` 데이터를 사용합니다(예: `1579059880000`). 자세한 내용은 [CSV 처리를 위한 Open CSV SerDe](csv-serde.md) 단원을 참조하세요.
+ `array` < data\$1type >
+ `map` < primitive\$1type, data\$1type >
+ `struct` < col\$1name : data\$1type [comment col\$1comment] [, ...] >

**[COMMENT table\$1comment]**  
`comment` 테이블 속성을 만들고, 지정한 `table_comment`로 채웁니다.

**[PARTITIONED BY (col\$1name data\$1type [ COMMENT col\$1comment ], ... ) ]**  
`col_name`, `data_type` 및 `col_comment`가 지정되어 있으며 하나 이상의 파티션 열로 분할된 테이블을 생성합니다. 테이블에는 고유한 열 이름과 값 조합으로 구성된 하나 이상의 파티션이 있을 수 있습니다. 지정된 각각의 조합에 별개의 데이터 디렉터리가 생성되어 상황에 따라 쿼리 성능을 개선할 수 있습니다. 분할된 열은 테이블 데이터 자체 내에는 존재하지 않습니다. 테이블 열과 동일한 `col_name`에 대한 값을 사용하는 경우 오류가 발생합니다. 자세한 내용은 [데이터 파티셔닝](partitions.md)을 참조하세요.  
파티션이 있는 테이블을 만든 후 [MSCK REPAIR TABLE](msck-repair-table.md) 절로 구성된 후속 쿼리를 실행하여 파티션 메타데이터(예: `MSCK REPAIR TABLE cloudfront_logs;`)를 새로 고칩니다. Hive와 호환되지 않는 파티션의 경우 데이터를 쿼리할 수 있도록 파티션을 로드하려면 [ALTER TABLE ADD PARTITION](alter-table-add-partition.md)을 사용합니다.

**[CLUSTERED BY (col\$1name, col\$1name, ...) INTO num\$1buckets BUCKETS]**  
파티셔닝 여부와 상관없이 지정된 `col_name` 열을 *버킷(buckets)*이라는 데이터 하위 집합으로 나눕니다. 이 `num_buckets` 파라미터는 생성할 버킷 수를 지정합니다. 버킷팅은 대용량 데이터 세트에 대한 일부 쿼리의 성능을 향상시킬 수 있습니다.

**[ROW FORMAT row\$1format]**  
해당되는 경우 테이블의 행 형식과 기본 소스 데이터를 지정합니다. `row_format`의 경우 `DELIMITED` 절을 이용해 하나 이상의 구분 기호를 지정하거나 아래 설명된 대로 `SERDE` 절을 사용합니다. `ROW FORMAT`을 생략하거나 `ROW FORMAT DELIMITED`를 지정하면 기본 SerDe가 사용됩니다.  
+ [DELIMITED FIELDS TERMINATED BY char [ESCAPED BY char]]
+ [DELIMITED COLLECTION ITEMS TERMINATED BY char]
+ [MAP KEYS TERMINATED BY char]
+ [LINES TERMINATED BY char]
+ [NULL DEFINED AS char]

  SATES AS 파일 형식이 `TEXTFILE`인 경우 Hive 0.13에서만 사용할 수 있습니다.
 **--또는--**   
+ SERDE 'serde\$1name' [WITH SERDEPROPERTIES ("property\$1name" = "property\$1value", "property\$1name" = "property\$1value" [, ...] )]

  `serde_name`은 사용할 SerDe를 나타냅니다. `WITH SERDEPROPERTIES` 절을 사용하면 SerDe에서 허용하는 하나 이상의 사용자 지정 속성을 제공할 수 있습니다.

**[STORED AS file\$1format]**  
테이블 데이터의 파일 형식을 지정합니다. 지정하지 않을 경우, `TEXTFILE`이 기본값입니다. `file_format` 옵션은 다음과 같습니다.  
+ SEQUENCEFILE
+ TEXTFILE
+ RCFILE
+ ORC
+ PARQUET
+ AVRO
+ ION
+ INPUTFORMAT input\$1format\$1classname OUTPUTFORMAT output\$1format\$1classname

**[LOCATION 's3://amzn-s3-demo-bucket/[folder]/']**  
테이블을 생성할 Amazon S3의 기본 데이터 위치를 지정합니다. 위치 경로는 버킷 이름 또는 버킷 이름과 하나 이상의 폴더여야 합니다. 파티션을 사용하는 경우 분할된 데이터의 루트를 지정합니다. 테이블 위치에 대한 자세한 내용은 [Amazon S3의 테이블 위치 지정](tables-location-format.md) 단원을 참조하세요. 데이터 형식 및 권한에 대한 자세한 내용은 [Amazon S3 고려 사항](creating-tables.md#s3-considerations) 단원을 참조하세요.  
폴더 또는 버킷에 후행 슬래시를 사용합니다. 파일 이름이나 glob 문자를 사용하지 마세요.  
 **다음 사용**:  
`s3://amzn-s3-demo-bucket/`  
`s3://amzn-s3-demo-bucket/folder/`  
`s3://amzn-s3-demo-bucket/folder/anotherfolder/`  
 **사용 금지:**  
`s3://amzn-s3-demo-bucket`  
`s3://amzn-s3-demo-bucket/*`  
`s3://amzn-s3-demo-bucket/mydatafile.dat`

**[TBLPROPERTIES ( ['has\$1encrypted\$1data'='true \$1 false',] ['encryption\$1option'='SSE\$1S3 \$1 SSE\$1KMS \$1 CSE\$1KMS',] ['kms\$1key'='aws\$1kms\$1key\$1arn',] ['classification'='classification\$1value',] property\$1name=property\$1value [, ...] ) ]**  
사전 정의된 테이블 속성 외에 테이블 정의에 사용할 사용자 지정 메타데이터 키-값 페어를 지정합니다(예: `"comment"`).  
**has\$1encrypted\$1data** - Athena에는 `has_encrypted_data`라는 속성이 내장되어 있습니다. 이 속성을 `true`로 설정하면 `LOCATION`에서 지정한 기본 데이터세트가 CSE-KMS로 암호화됨을 나타냅니다. 생략할 경우 작업 그룹의 설정이 클라이언트 측 설정을 재정의하지 않으면, `false`로 간주됩니다. 기본 데이터가 암호화되는데 `false`로 설정하거나 생략되면, 쿼리 결과가 오류가 됩니다. 자세한 내용은 [저장 시 암호화](encryption.md) 섹션을 참조하세요.  
**encryption\$1option** -이 속성을 `SSE_S3`, `SSE_KMS` 또는 `CSE_KMS`로 설정하여 `LOCATION`에서 지정한 기본 데이터세트에 사용되는 최고 수준의 암호화를 나타냅니다. 자세한 내용은 [저장 시 암호화](encryption.md) 섹션을 참조하세요.  
**kms\$1key** - 테이블 데이터 파일을 암호화 및 복호화하는 데 사용되는 AWS KMS 키 ARN으로 이 속성을 설정합니다. Athena는 이 키를 사용하여 `SSE_KMS` 또는 `CSE_KMS` 암호화로 쓸 때 테이블 데이터 파일을 암호화하고 CSE-KMS로 암호화된 테이블 데이터 파일을 복호화합니다. 이 속성은 `encryption_option`이 `SSE_KMS` 또는 `CSE_KMS`로 설정되는 경우 필수입니다. 자세한 내용은 [저장 시 암호화](encryption.md) 섹션을 참조하세요.  
**classification** - CloudTrail 콘솔에서 Athena용으로 생성된 테이블은 `classification` 속성 값으로 `cloudtrail`을 추가합니다. AWS Glue에서 ETL 작업을 실행하려면 `csv`, `parquet`, `orc`, `avro`, 또는 `json` 등 AWS Glue의 데이터 형식을 나타내기 위해 `classification` 속성이 포함된 테이블을 생성해야 합니다. 예를 들어 `'classification'='csv'`입니다. 이 속성을 지정하지 않으면 ETL 작업에 실패합니다. 이어서 AWS Glue 콘솔, API 또는 CLI를 사용해 이를 지정할 수 있습니다. 자세한 내용은 *AWS Glue 개발자 안내서*의 [ETL 작업용 테이블 생성](schema-classifier.md) 및 [AWS Glue에 작업 작성](https://docs.aws.amazon.com/glue/latest/dg/author-job.html)을 참조하세요.  
**compression\$1level** – `compression_level` 속성은 사용할 압축 수준을 지정합니다. 이 속성은 ZSTD 압축에만 적용됩니다. 가능한 값은 1\$122입니다. 기본값은 3입니다. 자세한 내용은 [ZSTD 압축 수준 사용](compression-support-zstd-levels.md) 섹션을 참조하세요.  
다른 테이블 속성에 대한 자세한 내용은 [ALTER TABLE SET TBLPROPERTIES](alter-table-set-tblproperties.md) 섹션을 참조하세요.

## 예제
<a name="create-table-examples"></a>

`CREATE TABLE` 문을 사용하는 다음 예제는 Amazon S3에 저장된 탭으로 구분된 행성 데이터에 기반한 테이블을 생성합니다.

```
CREATE EXTERNAL TABLE planet_data (
  planet_name string,
  order_from_sun int,
  au_to_sun float,
  mass float,
  gravity_earth float,
  orbit_years float,
  day_length float
  )
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\t'
STORED AS TEXTFILE
LOCATION 's3://amzn-s3-demo-bucket/tsv/'
```

다음 사항에 주의하세요.
+ `ROW FORMAT DELIMITED` 절은 데이터가 특정 문자로 구분됨을 나타냅니다.
+ `FIELDS TERMINATED BY '\t'` 절은 TSV 데이터의 필드가 탭 문자('\$1t')로 구분되도록 지정합니다.
+ `STORED AS TEXTFILE` 절은 데이터가 Amazon S3에 일반 텍스트 파일로 저장된 데이터임을 나타냅니다.

데이터를 쿼리하려면 다음과 같은 간단한 `SELECT` 문을 사용할 수 있습니다.

```
SELECT * FROM planet_data
```

예제를 사용하여 Athena에서 자체 TSV 테이블을 생성하려면 테이블과 열 이름을 자체 테이블 및 열의 이름과 데이터 유형으로 바꾸고 TSV 파일이 저장된 Amazon S3 경로를 가리키도록 `LOCATION` 절을 업데이트합니다.

테이블 생성에 대한 자세한 내용은 [Athena에서 테이블 생성](creating-tables.md) 단원을 참조하세요.

# CREATE TABLE AS
<a name="create-table-as"></a>

[SELECT](select.md) 쿼리의 결과로 채워지는 새 테이블을 생성합니다. 빈 테이블을 생성하려면 [CREATE TABLE](create-table.md)을 사용합니다. `CREATE TABLE AS`에서는 `CREATE TABLE` DDL 문을 `SELECT` DML 문과 결합하므로 기술적으로 DDL과 DML을 모두 포함합니다. `CREATE TABLE AS`가 다른 DDL 문과 함께 여기에 그룹화되어 있기는 하지만 Athena의 CTAS 쿼리는 Service Quotas을 위해 DML로 처리됩니다. Athena에서 Service Quotas에 대한 자세한 내용은 [Service Quotas](service-limits.md) 섹션을 참조하세요.

**참고**  
CTAS 문의 경우 예상 버킷 소유자 설정이 Amazon S3의 대상 테이블 위치에 적용되지 않습니다. 예상 버킷 소유자 설정은 Athena 쿼리 결과에 대해 지정한 Amazon S3 출력 위치에만 적용됩니다. 자세한 내용은 [Athena 콘솔을 사용하여 쿼리 결과 위치 지정](query-results-specify-location-console.md) 단원을 참조하십시오.

이 참조 주제 외에 `CREATE TABLE AS`에 대한 추가 정보는 [쿼리 결과에서 테이블 생성(CTAS)](ctas.md) 섹션을 참조하세요.

**Topics**
+ [시놉시스](#synopsis)
+ [CTAS 테이블 속성](#ctas-table-properties)
+ [예시](#ctas-table-examples)

## 시놉시스
<a name="synopsis"></a>

```
CREATE TABLE table_name
[ WITH ( property_name = expression [, ...] ) ]
AS query
[ WITH [ NO ] DATA ]
```

위치:

**WITH ( property\$1name = expression [, ...] )**  
선택적 CTAS 테이블 속성입니다. 일부는 데이터 스토리지 형식과 관련이 있습니다. [CTAS 테이블 속성](#ctas-table-properties) 섹션을 참조하세요.

**쿼리**  
새 테이블을 생성하는 데 사용되는 [SELECT](select.md) 쿼리입니다.  
파티션을 사용하여 쿼리를 생성하려는 경우 `SELECT` 문에서 열 목록 마지막에 분할된 열의 이름을 지정합니다.

**[ WITH [ NO ] DATA ]**  
`WITH NO DATA`가 사용되는 경우 원래 테이블과 스키마가 동일한 새로운 빈 테이블이 생성됩니다.

**참고**  
쿼리 결과 출력에 열 머리글을 포함하려면 CTAS 쿼리 대신 간단한 `SELECT` 쿼리를 사용할 수 있습니다. 쿼리 결과 위치에서 결과를 검색하거나 Athena 콘솔을 사용하여 결과를 직접 다운로드할 수 있습니다. 자세한 내용은 [쿼리 결과 및 최근 쿼리 작업](querying.md) 단원을 참조하십시오.

## CTAS 테이블 속성
<a name="ctas-table-properties"></a>

Athena의 각 CTAS 테이블에는 `WITH (property_name = expression [, ...] )`을 사용해 지정하는 선택적 CTAS 테이블 속성 목록이 있습니다. 이런 파라미터 사용에 대한 자세한 정보는 [CTAS 쿼리 예제](ctas-examples.md) 단원을 참조하세요.

** `WITH (property_name = expression [, ...], )` **    
 `table_type = ['HIVE', 'ICEBERG']`   
선택 사항입니다. 기본값은 `HIVE`입니다. 결과 테이블의 테이블 유형 지정  
예시  

```
WITH (table_type ='ICEBERG')
```  
 `external_location = [location]`   
Iceberg 테이블은 외부 테이블이 아니므로 이 속성은 Iceberg 테이블에 적용되지 않습니다. CTAS 문에서 Iceberg 테이블의 루트 위치를 정의하려면 이 단원의 뒷부분에 설명된 `location` 속성을 사용하세요.
선택 사항입니다. Athena가 Amazon S3에서 CTAS 쿼리를 저장하는 위치입니다.  
예시  

```
 WITH (external_location ='s3://amzn-s3-demo-bucket/tables/parquet_table/')
```
Athena는 쿼리 결과에 동일한 경로를 두 번 사용하지 않습니다. 위치를 수동으로 지정한 경우, 지정한 Amazon S3 위치에 데이터가 없는지 확인하세요. Athena는 데이터 삭제를 시도하지 않습니다. 동일한 위치를 다시 사용하려는 경우에는 데이터를 수동으로 삭제하세요. 그렇지 않으면 CTAS 쿼리에 실패합니다.  
[쿼리 결과 위치를 강제하는](workgroups-settings-override.md) 작업 그룹에서 `external_location`을 지정한 CTAS 쿼리를 실행할 경우 쿼리가 오류 메시지를 표시하며 실패합니다. 작업 그룹에 지정된 쿼리 결과 위치를 보려면 [작업 그룹 세부 정보를 조회](viewing-details-workgroups.md)하세요.  
작업 그룹이 쿼리 결과 위치에 대한 클라이언트 측 설정을 재정의하는 경우 Athena는 다음 위치에 테이블을 생성합니다.  

```
s3://amzn-s3-demo-bucket/tables/query-id/
```
`external_location` 속성을 사용하여 위치를 지정하지 않으며 작업 그룹이 클라이언트 측 설정을 재정의하지 않는 경우, Athena는 쿼리 결과 위치에 대한 [클라이언트 측 설정](query-results-specify-location-console.md)을 사용하여 다음 위치에 테이블을 생성합니다.  

```
s3://amzn-s3-demo-bucket/Unsaved-or-query-name/year/month/date/tables/query-id/
```  
 `is_external = [boolean]`   
선택 사항입니다. 테이블이 외부 테이블인지 나타냅니다. 기본값은 true입니다. Iceberg 테이블의 경우 이 값을 false로 설정해야 합니다.  
예시  

```
WITH (is_external = false)
```  
 `location = [location]`   
Iceberg 테이블에 필요합니다. 쿼리 결과에서 생성될 Iceberg 테이블의 루트 위치를 지정합니다.  
예시  

```
WITH (location ='s3://amzn-s3-demo-bucket/tables/iceberg_table/')
```  
 `field_delimiter = [delimiter]`   
선택 사항으로, 텍스트 기반 데이터 스토리지 형식과 관련이 있습니다. CSV, TSV 및 텍스트 파일의 단일 문자 필드 구분 기호입니다. 예: `WITH (field_delimiter = ',')`. 현재 CTAS 쿼리에는 여러 문자로 된 필드 구분 기호가 지원되지 않습니다. 필드 구분 기호를 지정하지 않으면 기본적으로 `\001`이 사용됩니다.  
 `format = [storage_format]`   
CTAS 쿼리 결과에 대한 스토리지 형식입니다(예: `ORC`, `PARQUET`, `AVRO`, `JSON`, `ION` 또는 `TEXTFILE`). Iceberg 테이블의 경우 허용되는 형식은 `ORC`, `PARQUET` 및 `AVRO`입니다. 생략하면 기본값은 `PARQUET`입니다. 이 파라미터의 이름인 `format`은 소문자로 표시되어야 합니다. 그렇지 않으면 CTAS 쿼리에 실패합니다.  
예시  

```
WITH (format = 'PARQUET')
```  
 `bucketed_by = ARRAY[ column_name[,…], bucket_count = [int] ]`   
이 속성은 Iceberg 테이블에 적용되지 않습니다. Iceberg 테이블의 경우 파티셔닝을 버킷 변환과 함께 사용합니다.
데이터를 버킷팅할 버킷의 배열 목록입니다. 생략하면 Athena는 이 쿼리에 데이터를 버킷팅하지 않습니다.  
 `bucket_count = [int]`   
이 속성은 Iceberg 테이블에 적용되지 않습니다. Iceberg 테이블의 경우 파티셔닝을 버킷 변환과 함께 사용합니다.
데이터를 버킷팅할 버킷의 이름입니다. 생략하면 Athena는 데이터를 버킷팅하지 않습니다. 예시  

```
CREATE TABLE bucketed_table WITH (
  bucketed_by = ARRAY[column_name], 
  bucket_count = 30, format = 'PARQUET', 
  external_location ='s3://amzn-s3-demo-bucket/tables/parquet_table/'
) AS 
SELECT 
  * 
FROM 
  table_name
```  
 `partitioned_by = ARRAY[ col_name[,…] ]`   
이 속성은 Iceberg 테이블에 적용되지 않습니다. Iceberg 테이블에 대해 파티션 변환을 사용하려면 이 단원의 뒷부분에 설명된 `partitioning` 속성을 사용하세요.
선택 사항입니다. CTAS 테이블이 분할되는 기준이 되는 열의 배열 목록입니다. 분할된 열의 이름이 `SELECT` 문의 열 목록 마지막에 나열되어 있는지 확인하세요.  
 `partitioning = ARRAY[partition_transform, ...]`   
선택 사항입니다. 생성할 Iceberg 테이블의 파티셔닝을 지정합니다. Iceberg는 다양한 파티션 변환과 파티션 진화를 지원합니다. 파티션 변환은 다음 표에 요약되어 있습니다.    
****    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/athena/latest/ug/create-table-as.html)
예시  

```
 WITH (partitioning = ARRAY['month(order_date)', 
                            'bucket(account_number, 10)', 
                            'country']))
```  
 `optimize_rewrite_min_data_file_size_bytes = [long]`   
선택 사항입니다. 데이터 최적화별 구성입니다. 최적화를 위해 지정된 값보다 작은 파일이 포함됩니다. 기본값은 `write_target_data_file_size_bytes` 값의 0.75배입니다. 이 속성은 Iceberg 테이블에만 적용됩니다. 자세한 내용은 [Iceberg 테이블 최적화](querying-iceberg-data-optimization.md) 단원을 참조하십시오.  
예시  

```
WITH (optimize_rewrite_min_data_file_size_bytes = 402653184)
```  
 `optimize_rewrite_max_data_file_size_bytes = [long]`   
선택 사항입니다. 데이터 최적화별 구성입니다. 최적화를 위해 지정된 값보다 큰 파일이 포함됩니다. 기본값은 `write_target_data_file_size_bytes` 값의 1.8배입니다. 이 속성은 Iceberg 테이블에만 적용됩니다. 자세한 내용은 [Iceberg 테이블 최적화](querying-iceberg-data-optimization.md) 단원을 참조하십시오.  
예시  

```
WITH (optimize_rewrite_max_data_file_size_bytes = 966367641)
```  
 `optimize_rewrite_data_file_threshold = [int]`   
선택 사항입니다. 데이터 최적화별 구성입니다. 최적화가 필요한 데이터 파일이 주어진 임계값보다 적으면 파일이 재작성되지 않습니다. 이를 통해 더 많은 데이터 파일을 누적하여 대상 크기에 더 가까운 파일을 생성하고 비용 절감을 위해 불필요한 계산을 건너뛸 수 있습니다. 기본값은 5입니다. 이 속성은 Iceberg 테이블에만 적용됩니다. 자세한 내용은 [Iceberg 테이블 최적화](querying-iceberg-data-optimization.md) 단원을 참조하십시오.  
예시  

```
WITH (optimize_rewrite_data_file_threshold = 5)
```  
 `optimize_rewrite_delete_file_threshold = [int]`   
선택 사항입니다. 데이터 최적화별 구성입니다. 데이터 파일과 연관된 삭제 파일이 임계값보다 적으면 데이터 파일이 재작성되지 않습니다. 이를 통해 비용 절감을 위해 각 데이터 파일에 대해 더 많은 삭제 파일을 누적할 수 있습니다. 기본값은 2입니다. 이 속성은 Iceberg 테이블에만 적용됩니다. 자세한 내용은 [Iceberg 테이블 최적화](querying-iceberg-data-optimization.md) 단원을 참조하십시오.  
예시  

```
WITH (optimize_rewrite_delete_file_threshold = 2)
```  
 `vacuum_min_snapshots_to_keep = [int]`   
선택 사항입니다. Vacuum 관련 구성입니다. 보존할 최신 스냅샷의 최소 수입니다. 기본 값은 1입니다. 이 속성은 Iceberg 테이블에만 적용됩니다. 자세한 내용은 [VACUUM](vacuum-statement.md) 단원을 참조하십시오.  
`vacuum_min_snapshots_to_keep` 속성을 사용하려면 Athena 엔진 버전 3이 필요합니다.
예시  

```
WITH (vacuum_min_snapshots_to_keep = 1)
```  
 `vacuum_max_snapshot_age_seconds = [long]`   
선택 사항입니다. Vacuum 관련 구성입니다. 보존할 스냅샷의 수명을 나타내는 기간(초)입니다. 기본값은 432,000(5일)입니다. 이 속성은 Iceberg 테이블에만 적용됩니다. 자세한 내용은 [VACUUM](vacuum-statement.md) 단원을 참조하십시오.  
`vacuum_max_snapshot_age_seconds` 속성을 사용하려면 Athena 엔진 버전 3이 필요합니다.
예시  

```
WITH (vacuum_max_snapshot_age_seconds = 432000)
```  
 `write_compression = [compression_format]`   
압축을 지정할 수 있는 모든 스토리지 형식에 사용할 압축 유형입니다. `compression_format` 값은 데이터가 테이블에 기록될 때 사용할 압축을 지정합니다. `TEXTFILE`, `JSON`, `PARQUET` 및 `ORC`파일 형식에 대한 압축을 지정할 수 있습니다.  
예를 들어 `format` 속성이 `PARQUET`을 스토리지 형식으로 지정할 경우, `write_compression`의 값은 Parquet에 대한 압축 형식을 지정합니다. 이 경우 `write_compression`의 값을 지정하는 것은 `parquet_compression`의 값을 지정하는 것과 같습니다.  
마찬가지로, `format` 속성이 `ORC`를 스토리지 형식으로 지정할 경우, `write_compression`의 값은 ORC에 대한 압축 형식을 지정합니다. 이 경우 `write_compression`의 값을 지정하는 것은 `orc_compression`의 값을 지정하는 것과 같습니다.  
동일한 CTAS 쿼리에서 여러 압축 형식 테이블 속성을 지정할 수 없습니다. 예를 들어 `write_compression` 및 `parquet_compression` 모두를 동일한 쿼리에서 지정할 수는 없습니다. `write_compression` 및 `orc_compression`에도 동일하게 적용됩니다. 각 파일 형식에 지원되는 압축 유형에 대한 자세한 내용은 [Athena에서 압축 사용](compression-formats.md) 섹션을 참조하세요.  
 `orc_compression = [compression_format]`   
`ORC` 데이터를 테이블에 쓸 때 `ORC` 파일 형식에 사용할 압축 유형입니다. 예: `WITH (orc_compression = 'ZLIB')`. `ORC` 파일의 청크(`ORC` Postscript 제외)가 지정한 압축을 사용하여 압축됩니다. 생략하면 `ORC`에 ZLIB 압축이 기본적으로 사용됩니다.  
일관성을 위해 `orc_compression` 대신 `write_compression` 속성을 사용하는 것이 좋습니다. `format` 속성을 사용하여 스토리지 형식을 `ORC`로 지정한 후 `write_compression` 속성을 사용하여 `ORC`가 사용할 압축 형식을 지정합니다.  
 `parquet_compression = [compression_format]`   
Parquet 데이터를 테이블에 쓸 때 Parquet 파일 형식에 사용할 압축 유형입니다. 예: `WITH (parquet_compression = 'SNAPPY')`. 이 압축은 Parquet 파일 내의 열 청크에 적용됩니다. 생략하면 Parquet에 GZIP 압축이 기본적으로 사용됩니다.  
일관성을 위해 `parquet_compression` 대신 `write_compression` 속성을 사용하는 것이 좋습니다. `format` 속성을 사용하여 스토리지 형식을 `PARQUET`로 지정한 후 `write_compression` 속성을 사용하여 `PARQUET`가 사용할 압축 형식을 지정합니다.  
 `compression_level = [compression_level]`   
사용할 압축 수준입니다. 이 속성은 ZSTD 압축에만 적용됩니다. 가능한 값은 1\$122입니다. 기본값은 3입니다. 자세한 내용은 [ZSTD 압축 수준 사용](compression-support-zstd-levels.md) 단원을 참조하십시오.

## 예시
<a name="ctas-table-examples"></a>

CTAS 쿼리의 예제는 다음 리소스를 참조하세요.
+  [CTAS 쿼리 예제](ctas-examples.md) 
+  [ETL 및 데이터 분석에 CTAS 및 INSERT INTO 사용](ctas-insert-into-etl.md) 
+  [Amazon Athena와 CTAS 문을 활용한 비용 절감 및 성능 개선](https://aws.amazon.com/blogs/big-data/using-ctas-statements-with-amazon-athena-to-reduce-cost-and-improve-performance/) 
+  [CTAS 및 INSERT INTO를 사용하여 100개 파티션 한도 문제 해결](ctas-insert-into.md) 

# CREATE VIEW 및 CREATE PROTECTED MULTI DIALECT VIEW
<a name="create-view"></a>

뷰는 향후 쿼리에서 참조할 수 있는 논리적 테이블입니다. 뷰에는 어떤 데이터도 포함되어 있지 않으며 데이터를 작성하지 않습니다. 대신에 뷰에서 지정된 쿼리는 다른 쿼리로 이 뷰를 참조할 때마다 실행됩니다.
+ `CREATE VIEW`는 지정된 `SELECT` 쿼리에서 Athena 뷰를 생성합니다. Athena 뷰는 Athena 내에서 작동합니다. Athena 뷰에 대한 자세한 내용은 [뷰 작업](views.md) 섹션을 참조하세요.
+ `CREATE PROTECTED MULTI DIALECT VIEW`는 AWS Glue Data Catalog에서 AWS Glue Data Catalog 뷰를 생성합니다. AWS Glue Data Catalog 뷰는 Amazon Athena, Amazon Redshift 등의 AWS 서비스 간에 단일 공통 뷰를 제공합니다. AWS Glue Data Catalog 뷰에 대한 자세한 내용은 [Athena에서 Data Catalog 뷰 사용](views-glue.md) 섹션을 참조하세요.

## CREATE VIEW
<a name="create-view-ate"></a>

Athena에서 사용할 뷰를 생성합니다.

### 시놉시스
<a name="synopsis"></a>

```
CREATE [ OR REPLACE ] VIEW view_name AS query
```

선택적 `OR REPLACE` 절을 사용하여 기존 뷰를 바꿔 업데이트할 수 있습니다. 자세한 내용은 [뷰 생성](views-console.md#creating-views) 섹션을 참조하세요.

### 예제
<a name="examples"></a>

테이블 `orders`에서 뷰 `test`를 만들려면 다음과 유사한 쿼리를 사용합니다.

```
CREATE VIEW test AS
SELECT 
orderkey, 
orderstatus, 
totalprice / 2 AS half
FROM orders;
```

테이블 `orders`에서 뷰 `orders_by_date`를 만들려면 다음 쿼리를 사용합니다.

```
CREATE VIEW orders_by_date AS
SELECT orderdate, sum(totalprice) AS price
FROM orders
GROUP BY orderdate;
```

기존 뷰를 업데이트하려면 다음과 유사한 예제를 사용합니다.

```
CREATE OR REPLACE VIEW test AS
SELECT orderkey, orderstatus, totalprice / 4 AS quarter
FROM orders;
```

 Athena 뷰를 사용하는 자세한 방법은 [뷰 작업](views.md) 섹션을 참조하세요.

## CREATE PROTECTED MULTI DIALECT VIEW
<a name="create-protected-multi-dialect-view"></a>

AWS Glue Data Catalog에서 AWS Glue Data Catalog 뷰를 생성합니다. Data Catalog 뷰는 Athena와 Amazon Redshift, Amazon EMR 등의 다른 SQL 엔진에서 작동하는 단일 뷰 스키마입니다.

### 구문
<a name="create-protected-multi-dialect-view-syntax"></a>

```
CREATE [ OR REPLACE ] PROTECTED MULTI DIALECT VIEW view_name 
SECURITY DEFINER 
[ SHOW VIEW JSON ]
AS query
```

**OR REPLACE**  
(선택 사항) 기존 뷰를 대체하여 업데이트합니다. 다른 엔진의 SQL 언어가 뷰에 있는 경우 Data Catalog 뷰를 대체할 수 없습니다. 호출 엔진의 뷰에 SQL 언어만 있는 경우 뷰를 바꿀 수 있습니다.

**PROTECTED**  
필수 키워드. 데이터 유출로부터 뷰를 보호하도록 지정합니다. Data Catalog 뷰는 `PROTECTED` 뷰로만 생성할 수 있습니다.

**MULTI DIALECT**  
뷰가 다양한 쿼리 엔진의 SQL 언어의 지원하므로 해당 엔진에서 읽을 수 있도록 지정합니다.

**SECURITY DEFINER**  
이 뷰에 정의자 의미 체계가 적용되도록 지정합니다. 정의자 의미 체계란 기본 테이블에 대한 유효 읽기 권한이 실제 읽기를 수행하는 보안 주체가 아니라 뷰를 정의한 보안 주체 또는 역할에 속함을 의미합니다.

**SHOW VIEW JSON**  
(선택 사항) 실제로 뷰를 생성하지 않고 Data Catalog 뷰 사양의 JSON을 반환합니다. 이 “테스트 실행” 옵션은 뷰에 대한 SQL을 검증하고 AWS Glue에서 사용할 테이블 메타데이터를 반환하려는 경우에 유용합니다.

### 예제
<a name="create-protected-multi-dialect-view-syntax-example"></a>

다음 예제에서는 `orders` 테이블의 쿼리를 기반으로 `orders_by_date` Data Catalog 뷰를 생성합니다.

```
CREATE PROTECTED MULTI DIALECT VIEW orders_by_date 
SECURITY DEFINER 
AS 
SELECT orderdate, sum(totalprice) AS price 
FROM orders 
WHERE order_city = 'SEATTLE' 
GROUP BY orderdate
```

AWS Glue Data Catalog 뷰를 사용하는 자세한 방법은 [Athena에서 Data Catalog 뷰 사용](views-glue.md) 섹션을 참조하세요.

# DESCRIBE
<a name="describe-table"></a>

지정된 테이블의 파티션 열을 포함하여 하나 이상의 열을 표시합니다. 이 명령은 복잡한 열의 속성을 검사하는 데 유용합니다.

## 시놉시스
<a name="synopsis"></a>

```
DESCRIBE [EXTENDED | FORMATTED] [db_name.]table_name [PARTITION partition_spec] [col_name ( [.field_name] | [.'$elem$'] | [.'$key$'] | [.'$value$'] )]
```

**중요**  
이 문에 대한 구문은 `DESCRIBE table_name`입니다(`DESCRIBE TABLE table_name`가 아님). 후자의 구문을 사용하면 오류 메시지 FAILED: SemanticException [Error 10001]: Table not found table가 표시됩니다.

## 파라미터
<a name="parameters"></a>

**[EXTENDED \$1 FORMATTED]**  
출력 형식을 결정합니다. 이러한 파라미터를 생략하면 파티션 열을 포함하여 열 이름 및 해당 데이터 형식을 테이블 형식으로 표시합니다. `FORMATTED`를 지정하면 열 이름 및 데이터 형식을 테이블 형식으로 표시할 뿐만 아니라 자세한 테이블 및 스토리지 정보도 표시합니다. `EXTENDED`는 열 및 데이터 형식 정보를 테이블 형식으로 표시하고 테이블의 자세한 메타데이터를 Thrift 직렬화 형식으로 표시합니다. 이 형식은 읽기 더 어렵고 주로 디버깅에 유용합니다.

**[PARTITION partition\$1spec]**  
포함된 경우 `partition_spec`에서 지정한 파티션에 대한 메타데이터를 나열합니다. 여기서 `partition_spec`은 `(partition_column = partition_col_value, partition_column = partition_col_value, ...)` 형식입니다.

**[col\$1name ( [.field\$1name] \$1 [.'\$1elem\$1'] \$1 [.'\$1key\$1'] \$1 [.'\$1value\$1'] )\$1 ]**  
검사할 열과 속성을 지정합니다. 구문의 요소에 `.field_name`을, 배열 요소에 `'$elem$'`을, 맵 키에 `'$key$'`를, 맵 값에 `'$value$'`를 지정할 수 있습니다. 이를 재귀적으로 지정하여 복잡한 열을 더 자세히 탐색할 수 있습니다.

### 예시
<a name="examples"></a>

```
DESCRIBE orders
```

```
DESCRIBE FORMATTED mydatabase.mytable PARTITION (part_col = 100) columnA;
```

다음 쿼리 및 출력은 Amazon EMR 샘플 데이터를 기반으로 한 `impressions` 테이블의 열 및 데이터 형식 정보를 표시합니다.

```
DESCRIBE impressions
```

```
requestbegintime          string                                         from deserializer   
adid                      string                                         from deserializer   
impressionid              string                                         from deserializer   
referrer                  string                                         from deserializer   
useragent                 string                                         from deserializer   
usercookie                string                                         from deserializer   
ip                        string                                         from deserializer   
number                    string                                         from deserializer   
processid                 string                                         from deserializer   
browsercokie              string                                         from deserializer   
requestendtime            string                                         from deserializer   
timers                    struct<modellookup:string,requesttime:string>  from deserializer   
threadid                  string                                         from deserializer   
hostname                  string                                         from deserializer   
sessionid                 string                                         from deserializer   
dt                        string

# Partition Information
# col_name                data_type                 comment             

dt                        string
```

다음 예제 쿼리 및 출력은 `FORMATTED` 옵션이 사용된 경우 동일한 테이블에 대한 결과를 표시합니다.

```
DESCRIBE FORMATTED impressions
```

```
requestbegintime          string                                         from deserializer
adid                      string                                         from deserializer
impressionid              string                                         from deserializer
referrer                  string                                         from deserializer
useragent                 string                                         from deserializer
usercookie                string                                         from deserializer
ip                        string                                         from deserializer
number                    string                                         from deserializer
processid                 string                                         from deserializer
browsercokie              string                                         from deserializer
requestendtime            string                                         from deserializer
timers                    struct<modellookup:string,requesttime:string>  from deserializer
threadid                  string                                         from deserializer
hostname                  string                                         from deserializer
sessionid                 string                                         from deserializer
dt                        string

# Partition Information
# col_name                data_type                 comment

dt                        string

# Detailed Table Information
Database:                 sampledb
Owner:                    hadoop
CreateTime:               Thu Apr 23 02:55:21 UTC 2020
LastAccessTime:           UNKNOWN
Protect Mode:             None
Retention:                0
Location:                 s3://us-east-1.elasticmapreduce/samples/hive-ads/tables/impressions
Table Type:               EXTERNAL_TABLE
Table Parameters:
        EXTERNAL                  TRUE
        transient_lastDdlTime     1587610521

# Storage Information
SerDe Library:                         org.openx.data.jsonserde.JsonSerDe
InputFormat:                           org.apache.hadoop.mapred.TextInputFormat
OutputFormat:                          org.apache.hadoop.hive.ql.io.IgnoreKeyTextOutputFormat
Compressed:                            No
Num Buckets:                           -1
Bucket Columns:                        []
Sort Columns:                          []
Storage Desc Params:
        paths                                  requestbegintime, adid, impressionid, referrer, useragent, usercookie, ip
        serialization.format                   1
```

다음 예제 쿼리 및 출력은 `EXTENDED` 옵션이 사용된 경우 동일한 테이블에 대한 결과를 표시합니다. 자세한 테이블 정보는 한 줄로 출력되지만 여기서는 가독성을 위해 형식이 지정됩니다.

```
DESCRIBE EXTENDED impressions
```

```
requestbegintime          string                                         from deserializer
adid                      string                                         from deserializer
impressionid              string                                         from deserializer
referrer                  string                                         from deserializer
useragent                 string                                         from deserializer
usercookie                string                                         from deserializer
ip                        string                                         from deserializer
number                    string                                         from deserializer
processid                 string                                         from deserializer
browsercokie              string                                         from deserializer
requestendtime            string                                         from deserializer
timers                    struct<modellookup:string,requesttime:string>  from deserializer
threadid                  string                                         from deserializer
hostname                  string                                         from deserializer
sessionid                 string                                         from deserializer
dt                        string

# Partition Information
# col_name                data_type                 comment

dt                        string

Detailed Table Information       Table(tableName:impressions, dbName:sampledb, owner:hadoop, createTime:1587610521, 
lastAccessTime:0, retention:0, sd:StorageDescriptor(cols:[FieldSchema(name:requestbegintime, type:string, comment:null), 
FieldSchema(name:adid, type:string, comment:null), FieldSchema(name:impressionid, type:string, comment:null), 
FieldSchema(name:referrer, type:string, comment:null), FieldSchema(name:useragent, type:string, comment:null), 
FieldSchema(name:usercookie, type:string, comment:null), FieldSchema(name:ip, type:string, comment:null), 
FieldSchema(name:number, type:string, comment:null), FieldSchema(name:processid, type:string, comment:null), 
FieldSchema(name:browsercokie, type:string, comment:null), FieldSchema(name:requestendtime, type:string, comment:null), 
FieldSchema(name:timers, type:struct<modellookup:string,requesttime:string>, comment:null), FieldSchema(name:threadid, 
type:string, comment:null), FieldSchema(name:hostname, type:string, comment:null), FieldSchema(name:sessionid, 
type:string, comment:null)], location:s3://us-east-1.elasticmapreduce/samples/hive-ads/tables/impressions, 
inputFormat:org.apache.hadoop.mapred.TextInputFormat, 
outputFormat:org.apache.hadoop.hive.ql.io.IgnoreKeyTextOutputFormat, compressed:false, numBuckets:-1, 
serdeInfo:SerDeInfo(name:null, serializationLib:org.openx.data.jsonserde.JsonSerDe, parameters:{serialization.format=1, 
paths=requestbegintime, adid, impressionid, referrer, useragent, usercookie, ip}), bucketCols:[], sortCols:[], parameters:{}, 
skewedInfo:SkewedInfo(skewedColNames:[], skewedColValues:[], skewedColValueLocationMaps:{}), 
storedAsSubDirectories:false), partitionKeys:[FieldSchema(name:dt, type:string, comment:null)], 
parameters:{EXTERNAL=TRUE, transient_lastDdlTime=1587610521}, viewOriginalText:null, viewExpandedText:null, 
tableType:EXTERNAL_TABLE)
```

# DESCRIBE VIEW
<a name="describe-view"></a>

지정된 Athena 또는 AWS Glue Data Catalog 뷰의 열 목록을 표시합니다. 복잡한 뷰의 속성을 검사하는 데 유용합니다.

 Data Catalog 뷰에서 명령문의 출력은 Lake Formation 액세스 제어에 의해 제어되며 호출자가 액세스할 수 있는 열을 보여줍니다.

## 시놉시스
<a name="synopsis"></a>

```
DESCRIBE [db_name.]view_name
```

## 예
<a name="examples"></a>

```
DESCRIBE orders
```

[SHOW COLUMNS](show-columns.md), [SHOW CREATE VIEW](show-create-view.md), [SHOW VIEWS](show-views.md) 및 [DROP VIEW](drop-view.md)도 참조하세요.

# DROP DATABASE
<a name="drop-database"></a>

카탈로그에서 명명된 데이터베이스를 제거합니다. 데이터베이스에 테이블이 포함되어 있으면 `DROP DATABASE`를 실행하기 전에 테이블을 삭제하거나 `CASCADE` 절을 사용해야 합니다. `DATABASE`와 `SCHEMA`는 동일한 의미로 통용됩니다. 두 용어의 의미는 동일합니다.

## 시놉시스
<a name="synopsis"></a>

```
DROP {DATABASE | SCHEMA} [IF EXISTS] database_name [RESTRICT | CASCADE]
```

## 파라미터
<a name="parameters"></a>

**[IF EXISTS]**  
`database_name`이 없으면 오류가 억제되도록 합니다.

**[RESTRICT\$1CASCADE]**  
`DROP` 작업 중에 `database_name` 내부의 테이블을 어떻게 취급할지 결정합니다. `RESTRICT`를 지정하면 테이블을 포함한 데이터베이스는 삭제되지 않습니다. 이는 기본 설정 동작입니다. `CASCADE`를 지정하면 데이터베이스와 그에 속한 테이블이 모두 삭제됩니다.

## 예시
<a name="examples"></a>

```
DROP DATABASE clickstreams;
```

```
DROP SCHEMA IF EXISTS clickstreams CASCADE;
```

**참고**  
이름에 특수 문자(예: `my-database`)가 있는 데이터베이스를 삭제하려고 시도하면 오류 메시지가 표시될 수 있습니다. 이 문제를 해결하려면 데이터베이스 이름을 백틱(`) 문자로 묶어봅니다. Athena의 이름 지정 데이터베이스에 대한 자세한 내용은 [이름 데이터베이스, 테이블 및 열](tables-databases-columns-names.md) 섹션을 참조하세요.

# DROP TABLE
<a name="drop-table"></a>

`table_name`이라는 테이블에 대한 메타데이터 테이블 정의를 제거합니다. 외부 테이블을 삭제해도 기본 데이터는 그대로 유지됩니다.

## 시놉시스
<a name="synopsis"></a>

```
DROP TABLE [IF EXISTS] table_name
```

## 파라미터
<a name="parameters"></a>

**[ IF EXISTS ]**  
`table_name`이 없으면 오류가 억제되도록 합니다.

## 예시
<a name="examples"></a>

```
DROP TABLE fulfilled_orders
```

```
DROP TABLE IF EXISTS fulfilled_orders
```

Athena 콘솔 쿼리 편집기를 사용하여 밑줄(\$1) 이외의 특수 문자가 있는 테이블을 삭제하려면 다음 예제와 같이 백틱을 사용합니다.

```
DROP TABLE `my-athena-database-01.my-athena-table`
```

JDBC 커넥터를 사용하여 특수 문자가 있는 테이블을 삭제할 때는 백틱 문자가 필요하지 않습니다.

```
DROP TABLE my-athena-database-01.my-athena-table
```

# DROP VIEW
<a name="drop-view"></a>

기존 Athena 또는 AWS Glue Data Catalog 뷰를 삭제합니다. 뷰가 없는 경우 선택적 `IF EXISTS` 절이 오류가 억제되도록 합니다.

Data Catalog 뷰의 경우 Athena 뷰 구문(언어)이 Data Catalog 뷰에 있는 경우에만 뷰를 삭제합니다. 예를 들어 사용자가 Athena에서 `DROP VIEW`를 직접적으로 호출하면 Athena 언어가 뷰에 있는 경우에만 뷰가 삭제됩니다. 그렇지 않으면 작업이 실패합니다. Data Catalog 뷰를 삭제하려면 Lake Formation 관리자 또는 뷰 정의자 권한이 필요합니다.

자세한 내용은 [뷰 작업](views.md) 및 [Athena에서 Data Catalog 뷰 사용](views-glue.md) 단원을 참조하세요.

## 시놉시스
<a name="synopsis"></a>

```
DROP VIEW [ IF EXISTS ] view_name
```

## 예시
<a name="examples"></a>

```
DROP VIEW orders_by_date
```

```
DROP VIEW IF EXISTS orders_by_date
```

[CREATE VIEW 및 CREATE PROTECTED MULTI DIALECT VIEW](create-view.md), [SHOW COLUMNS](show-columns.md), [SHOW CREATE VIEW](show-create-view.md), [SHOW VIEWS](show-views.md) 및 [DESCRIBE VIEW](describe-view.md)도 참조하세요.

# MSCK REPAIR TABLE
<a name="msck-repair-table"></a>

Hive 호환 파티션을 추가한 후 `MSCK REPAIR TABLE` 명령을 사용하여 카탈로그의 메타데이터를 업데이트합니다.

`MSCK REPAIR TABLE` 명령은 테이블을 생성한 후 파일 시스템에 추가된 Hive 호환 파티션을 위해 Amazon S3 등의 파일 시스템을 스캔합니다. `MSCK REPAIR TABLE`은 테이블 메타데이터의 파티션과 S3의 파티션을 비교합니다. 테이블을 생성할 때 지정한 S3 위치에 새 파티션이 있으면 메타데이터와 Athena 테이블에 해당 파티션이 추가됩니다.

물리적 파티션을 추가하면 카탈로그의 메타데이터가 파일 시스템의 데이터 레이아웃과 일치하지 않게 되므로 새 파티션에 대한 정보를 카탈로그에 추가해야 합니다. 메타데이터를 업데이트하려면 Athena에서 새 파티션의 데이터를 쿼리할 수 있도록 `MSCK REPAIR TABLE`을 실행합니다.

**참고**  
`MSCK REPAIR TABLE`은 메타데이터에 파티션을 추가하기만 합니다. 파티션을 제거하지는 않습니다. Amazon S3에서 파티션을 수동으로 삭제한 후 메타데이터에서 파티션을 제거하려면 `ALTER TABLE table-name DROP PARTITION` 명령을 실행합니다. 자세한 내용은 [ALTER TABLE DROP PARTITION](alter-table-drop-partition.md) 단원을 참조하세요.

## 고려 사항 및 제한 사항
<a name="msck-repair-table-considerations"></a>

`MSCK REPAIR TABLE`을 사용할 때는 다음 사항에 유의하세요.
+ 모든 파티션을 추가하려면 다소 시간이 걸릴 수 있습니다. 이 작업의 시간이 초과되면 카탈로그에 몇 개의 파티션만 추가되는 불완전한 상태가 됩니다. 모든 파티션이 추가될 때까지 동일한 테이블에서 `MSCK REPAIR TABLE`을 실행해야 합니다. 자세한 내용은 [데이터 파티셔닝](partitions.md) 섹션을 참조하세요.
+ Hive와 호환되지 않는 파티션의 경우 데이터를 쿼리할 수 있도록 파티션을 로드하려면 [ALTER TABLE ADD PARTITION](alter-table-add-partition.md)을 사용합니다.
+ Athena에 사용될 파티션 위치는 `s3` 프로토콜(예: `s3://amzn-s3-demo-bucket/folder/`)을 사용해야 합니다. Athena에서, 다른 프로토콜(예: `s3a://bucket/folder/`)을 사용하는 위치는 포함 테이블에서 `MSCK REPAIR TABLE` 쿼리를 실행할 때 쿼리 실패를 초래하게 됩니다.
+ `MSCK REPAIR TABLE`은 일치하는 파티션 스키마를 찾기 위해 폴더와 하위 폴더를 모두 스캔하기 때문에 별도의 폴더 계층 구조에 있는 별도의 테이블에 데이터를 보관해야 합니다. 예를 들어 테이블 1의 데이터를 `s3://amzn-s3-demo-bucket1`에 두고 테이블 2에 대한 데이터을 `s3://amzn-s3-demo-bucket1/table-2-data`에 두었다고 가정합시다. 두 테이블이 모두 문자열로 분할된 경우 `MSCK REPAIR TABLE`은 테이블 2의 파티션을 테이블 1에 추가합니다. 이를 방지하려면 대신에 `s3://amzn-s3-demo-bucket1` 및 `s3://amzn-s3-demo-bucket2`와 같은 별도의 폴더 구조를 사용하세요. 이 동작은 Amazon EMR과 Apache Hive에서도 동일합니다.
+ 알려진 문제로 인해 파티션 값에 콜론(`MSCK REPAIR TABLE`)이 포함된 경우(예: 파티션 값이 타임스탬프인 경우) `:`이 자동으로 실패합니다. 임시 해결책으로 [ALTER TABLE ADD PARTITION](alter-table-add-partition.md)을 사용합니다.
+ `MSCK REPAIR TABLE`에서는 밑줄(\$1)로 시작하는 파티션 열 이름을 추가하지 않습니다. 이 제한을 해결하려면 [ALTER TABLE ADD PARTITION](alter-table-add-partition.md)을 사용합니다.

## 시놉시스
<a name="synopsis"></a>

```
MSCK REPAIR TABLE table_name
```

## 예제
<a name="examples"></a>

```
MSCK REPAIR TABLE orders;
```

## 문제 해결
<a name="msck-repair-table-troubleshooting"></a>

`MSCK REPAIR TABLE`을 실행한 후 Athena가 AWS Glue Data Catalog의 테이블에 파티션을 추가하지 않으면 다음을 확인하세요.
+ **AWS Glue 액세스** – AWS Identity and Access Management(IAM) 역할에 `glue:BatchCreatePartition` 작업을 허용하는 정책이 있는지 확인합니다. 자세한 내용은 이 문서의 후반부에서 [IAM 정책에서 glue:BatchCreatePartition 허용](#msck-repair-table-troubleshooting-allow-gluebatchcreatepartition-in-the-policy) 단원을 참조하세요.
+ **Amazon S3 액세스** - 역할에 Amazon S3에 액세스할 수 있는 충분한 권한([https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_DescribeJob.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_DescribeJob.html) 작업 포함)이 있는 정책이 있는지 확인합니다. 허용할 Amazon S3 작업에 대한 예는 [Athena에서 Amazon S3 버킷에 대한 크로스 계정 액세스 구성](cross-account-permissions.md)의 버킷 정책 예시를 참조하세요.
+ **Amazon S3 객체 키 대소문자 표기 방식** – Amazon S3 경로가 카멜 표기법이 아닌 소문자인지 확인합니다(예: `userId` 대신 `userid`). 또는 `ALTER TABLE ADD PARTITION`을 사용하여 객체 키 이름을 지정합니다. 자세한 내용은 이 문서의 후반부에서 [Amazon S3 경로 변경 또는 재정의](#msck-repair-table-troubleshooting-change-or-redefine-the-amazon-s3-path) 단원을 참조하세요.
+ **쿼리 시간 제한** – `MSCK REPAIR TABLE`은 처음으로 테이블을 만들거나 데이터와 파티션 메타 데이터 간의 패리티에 대한 불확실성이 있을 때 가장 적합합니다. `MSCK REPAIR TABLE`을 사용해 새 파티션을 자주 추가하는데(예: 날마다) 쿼리 시간 제한이 발생하는 경우 [ALTER TABLE ADD PARTITION](alter-table-add-partition.md) 사용을 고려하는 것이 좋습니다.
+ **파일 시스템에서 파티션 누락** - Amazon S3에서 파티션을 수동으로 삭제한 다음 `MSCK REPAIR TABLE`을 실행하면 Partitions missing from filesystem 오류 메시지가 나타날 수 있습니다. 이는 `MSCK REPAIR TABLE`이 기한 경과된 파티션을 테이블 메타데이터를 제거하지 않았기 때문입니다. 테이블 메타데이터에서 삭제된 파티션을 제거하려면 [ALTER TABLE DROP PARTITION](alter-table-drop-partition.md)을 대신 실행합니다. [SHOW PARTITIONS](show-partitions.md)는 비슷하게 파티션을 나열하지만 파일 시스템의 파티션을 제외하고 메타데이터의 파티션만 나열합니다. 
+ **"NullPointerException name is null" 오류**

  `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` 속성이 자동으로 정의됩니다.

다음 섹션에서 여러 세부 정보를 추가로 제공합니다.

### IAM 정책에서 glue:BatchCreatePartition 허용
<a name="msck-repair-table-troubleshooting-allow-gluebatchcreatepartition-in-the-policy"></a>

`MSCK REPAIR TABLE` 실행을 위해 사용 중인 역할에 연결된 IAM 정책을 검토합니다. [Athena와 함께 AWS Glue Data Catalog를 사용](data-sources-glue.md)하는 경우 IAM 정책에서 `glue:BatchCreatePartition` 작업을 허용해야 합니다. `glue:BatchCreatePartition` 작업을 허용하는 IAM 정책의 예는 [AWS 관리형 정책: AmazonAthenaFullAccess](security-iam-awsmanpol.md#amazonathenafullaccess-managed-policy) 단원을 참조하세요.

### Amazon S3 경로 변경 또는 재정의
<a name="msck-repair-table-troubleshooting-change-or-redefine-the-amazon-s3-path"></a>

Amazon S3 경로에 있는 하나 이상의 객체 키가 소문자가 아닌 카멜 표기법으로 표시된 경우 `MSCK REPAIR TABLE`에서는 AWS Glue Data Catalog에 파티션을 추가하지 않을 수도 있습니다. 예를 들어 Amazon S3 경로에 객체 키 이름 `userId`가 포함되어 있는 경우 다음 파티션은 AWS Glue Data Catalog에 추가되지 않을 수 있습니다.

```
s3://amzn-s3-demo-bucket/path/userId=1/

s3://amzn-s3-demo-bucket/path/userId=2/

s3://amzn-s3-demo-bucket/path/userId=3/
```

이 문제를 해결하려면 다음 중 한 가지를 사용하십시오.
+ Amazon S3 객체 키를 생성하는 경우 카멜 표기법 대신 소문자를 사용합니다.

  ```
  s3://amzn-s3-demo-bucket/path/userid=1/
  
  s3://amzn-s3-demo-bucket/path/userid=2/
  
  s3://amzn-s3-demo-bucket/path/userid=3/
  ```
+ 다음 예제와 같이 [ALTER TABLE ADD PARTITION](alter-table-add-partition.md)을 사용하여 위치를 재정의합니다.

  ```
  ALTER TABLE table_name ADD [IF NOT EXISTS]
  PARTITION (userId=1)
  LOCATION 's3://amzn-s3-demo-bucket/path/userId=1/'
  PARTITION (userId=2)
  LOCATION 's3://amzn-s3-demo-bucket/path/userId=2/'
  PARTITION (userId=3)
  LOCATION 's3://amzn-s3-demo-bucket/path/userId=3/'
  ```

Amazon S3 객체 키 이름은 대문자를 사용할 수 있지만 Amazon S3 버킷 이름 자체는 항상 소문자여야 합니다. 자세한 내용은 *Amazon S3 사용 설명서*의 [객체 키 명명 지침](https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-keys.html#object-key-guidelines) 및 [버킷 이름 지정 규칙](https://docs.aws.amazon.com/AmazonS3/latest/userguide/bucketnamingrules.html)을 참조하세요.

# SHOW COLUMNS
<a name="show-columns"></a>

지정된 단일 테이블, Athena 뷰 또는 Data Catalog 뷰의 열 이름만 표시합니다. Athena 뷰에 대한 세부 정보를 얻으려면 대신 AWS Glue Data Catalog를 쿼리합니다. 자세한 내용과 예제는 [AWS Glue Data Catalog 쿼리](querying-glue-catalog.md) 주제의 다음 섹션을 참조하세요.
+ 열 메타데이터(예: 데이터 형식)를 보려면 [지정된 테이블 또는 뷰의 열 나열 또는 검색](querying-glue-catalog-listing-columns.md) 섹션을 참조하세요.
+ `AwsDataCatalog`에서 특정 데이터베이스의 모든 테이블에 대한 모든 열을 보려면 [지정된 테이블 또는 뷰의 열 나열 또는 검색](querying-glue-catalog-listing-columns.md) 섹션을 참조하세요.
+ `AwsDataCatalog`에서 모든 데이터베이스의 모든 테이블에 대한 모든 열을 보려면 [모든 테이블의 모든 열 나열](querying-glue-catalog-listing-all-columns-for-all-tables.md) 섹션을 참조하세요.
+ 데이터베이스의 특정 테이블에서 공통적으로 포함하는 열을 보려면 [특정 테이블에서 공통적으로 포함하는 열 나열](querying-glue-catalog-listing-columns-in-common.md) 섹션을 참조하세요.

Data Catalog 뷰에서 명령문의 출력은 Lake Formation 액세스 제어에 의해 제어되며 호출자가 액세스할 수 있는 열을 보여줍니다.

## 시놉시스
<a name="synopsis"></a>

```
SHOW COLUMNS {FROM|IN} database_name.table_or_view_name
```

```
SHOW COLUMNS {FROM|IN} table_or_view_name [{FROM|IN} database_name]
```

`FROM` 및 `IN` 키워드는 서로 바꿔 사용할 수 있습니다. *table\$1or\$1view\$1name* 또는 *database\$1name*에 하이픈 같은 특수 문자가 있는 경우 이름을 억음 부호(backquote)로 둘러쌉니다(예: ``my-database`.`my-table``). *table\$1or\$1view\$1name* 또는 *database\$1name*을 작은따옴표나 큰따옴표로 둘러싸면 안 됩니다. 현재 `LIKE`의 사용 및 패턴 일치 표현식은 지원되지 않습니다.

## 예시
<a name="examples"></a>

다음의 동일한 예제는 `customers` 데이터베이스에 있는 `orders` 테이블의 열을 보여줍니다. 처음 두 예제는 `customers`가 현재 데이터베이스라고 가정합니다.

```
SHOW COLUMNS FROM orders
```

```
SHOW COLUMNS IN orders
```

```
SHOW COLUMNS FROM customers.orders
```

```
SHOW COLUMNS IN customers.orders
```

```
SHOW COLUMNS FROM orders FROM customers
```

```
SHOW COLUMNS IN orders IN customers
```

# SHOW CREATE TABLE
<a name="show-create-table"></a>

`table_name`이라는 기존 테이블을 분석하여 이를 작성한 쿼리를 생성합니다.

## 시놉시스
<a name="synopsis"></a>

```
SHOW CREATE TABLE [db_name.]table_name
```

## 파라미터
<a name="parameters"></a>

**TABLE [db\$1name.]table\$1name**  
`db_name` 파라미터는 선택 항목입니다. 생략하면 컨텍스트의 기본값은 현재 데이터베이스입니다.  
테이블 이름은 필수 항목입니다.

## 예시
<a name="examples"></a>

```
SHOW CREATE TABLE orderclickstoday;
```

```
SHOW CREATE TABLE `salesdata.orderclickstoday`;
```

## 문제 해결
<a name="show-create-table-troubleshooting"></a>

`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` 속성이 자동으로 정의됩니다.

# SHOW CREATE VIEW
<a name="show-create-view"></a>

지정된 Athena 또는 Data Catalog 뷰를 생성한 SQL 문을 보여 줍니다. 반환된 SQL은 Athena에서 사용되는 뷰 생성 구문을 보여줍니다. Data Catalog 뷰에 대한 `SHOW CREATE VIEW`를 직접적으로 호출하려면 Lake Formation 관리자 또는 뷰 정의자 권한이 필요합니다.

## 시놉시스
<a name="synopsis"></a>

```
SHOW CREATE VIEW view_name
```

## 예시
<a name="examples"></a>

```
SHOW CREATE VIEW orders_by_date
```

[CREATE VIEW 및 CREATE PROTECTED MULTI DIALECT VIEW](create-view.md) 및 [DROP VIEW](drop-view.md)도 참조하십시오.

# SHOW DATABASES
<a name="show-databases"></a>

메타스토어에 정의된 모든 데이터베이스를 나열합니다. `DATABASES` 또는 `SCHEMAS`를 사용할 수 있습니다. 두 용어의 의미는 동일합니다.

`SHOW DATABASES`는 프로그래밍 방식으로는 [ListDatabases](https://docs.aws.amazon.com/athena/latest/APIReference/API_ListDatabases.html) Athena API 작업과 동일합니다. AWS SDK for Python (Boto3)에서 동일한 메서드는 [list\$1databases](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/athena/client/list_databases.html)입니다.

## 시놉시스
<a name="synopsis"></a>

```
SHOW {DATABASES | SCHEMAS} [LIKE 'regular_expression']
```

## 파라미터
<a name="parameters"></a>

**[LIKE '*regular\$1expression*']**  
지정한 `regular_expression`과 일치하는 기준으로 데이터베이스 목록을 필터링합니다. 와일드카드 문자 일치의 경우 문자 0에서 무제한으로 일치시키는 조합 `.*`를 사용할 수 있습니다.

## 예시
<a name="examples"></a>

```
SHOW SCHEMAS;
```

```
SHOW DATABASES LIKE '.*analytics';
```

# SHOW PARTITIONS
<a name="show-partitions"></a>

정렬되지 않은 순서로 Athena 테이블의 모든 파티션을 나열합니다.

## 시놉시스
<a name="synopsis"></a>

```
SHOW PARTITIONS table_name
```
+ 테이블에 파티션을 표시하고 특정 순서로 나열하려면 [특정 테이블의 파티션 나열](querying-glue-catalog-listing-partitions.md) 페이지의 [AWS Glue Data Catalog 쿼리](querying-glue-catalog.md) 섹션을 참조하세요.
+ 파티션의 내용을 보려면 [데이터 쿼리](partitions.md#query-the-data) 페이지의 [데이터 파티셔닝](partitions.md) 섹션을 참조하세요.
+ `SHOW PARTITIONS`는 Athena에 의해 프로젝션되었지만 AWS Glue 카탈로그에 등록되지 않은 파티션은 나열하지 않습니다. 파티션 프로젝션에 대한 자세한 내용은 [Amazon Athena에서 파티션 프로젝션 사용](partition-projection.md) 단원을 참조하세요.
+  `SHOW PARTITIONS`는 실제 파일 시스템의 파티션이 아니라 메타데이터의 파티션을 나열합니다. Amazon S3에서 파티션을 수동으로 삭제한 후 메타데이터를 업데이트하려면 [ALTER TABLE DROP PARTITION](alter-table-drop-partition.md)을 실행합니다.

## 예제
<a name="examples"></a>

다음 쿼리 예제는 미국 교통국의 항공편 테이블 데이터를 보여주는 `flight_delays_csv` 테이블의 파티션을 보여줍니다. `flight_delays_csv` 테이블 예제에 대한 자세한 내용은 [CSV, TSV, 사용자 지정 구분 기호로 구분된 파일에 대한 Lazy Simple SerDe](lazy-simple-serde.md) 단원을 참조하세요. 테이블은 연도별로 분할되어 있습니다.

```
SHOW PARTITIONS flight_delays_csv
```

**결과**

```
year=2007
year=2015
year=1999
year=1993
year=1991
year=2003
year=1996
year=2014
year=2004
year=2011
...
```

다음 쿼리 예제는 샘플 웹 검색 데이터가 들어 있는 `impressions` 테이블의 파티션을 보여줍니다. `impressions` 테이블 예제에 대한 자세한 내용은 [데이터 파티셔닝](partitions.md) 단원을 참조하세요. 테이블은 `dt`(datetime) 열을 기준으로 분할되어 있습니다.

```
SHOW PARTITIONS impressions
```

**결과**

```
dt=2009-04-12-16-00
dt=2009-04-13-18-15
dt=2009-04-14-00-20
dt=2009-04-12-13-00
dt=2009-04-13-02-15
dt=2009-04-14-12-05
dt=2009-04-14-06-15
dt=2009-04-12-21-15
dt=2009-04-13-22-15
...
```

### 정렬된 순서로 파티션 목록 표시
<a name="show-partitions-examples-ordering"></a>

결과 목록에서 파티션을 정렬하려면 `SHOW PARTITIONS` 대신에 다음 `SELECT` 구문을 사용합니다.

```
SELECT * FROM database_name."table_name$partitions" ORDER BY column_name
```

다음 쿼리는 `flight_delays_csv` 예제의 파티션 목록을 정렬된 순서로 보여줍니다.

```
SELECT * FROM "flight_delays_csv$partitions" ORDER BY year
```

**결과**

```
year
1987
1988
1989
1990
1991
1992
1993
1994
1995
1996
1997
1998
1999
...
```

자세한 내용은 [특정 테이블의 파티션 나열](querying-glue-catalog-listing-partitions.md) 페이지의 [AWS Glue Data Catalog 쿼리](querying-glue-catalog.md) 단원을 참조하세요.

# SHOW TABLES
<a name="show-tables"></a>

데이터베이스의 모든 기본 테이블과 뷰를 나열합니다.

**참고**  
[GetQueryExecution](https://docs.aws.amazon.com/athena/latest/APIReference/API_GetQueryExecution.html) API 작업에서 `SHOW TABLES`에 대한 [StatementType](https://docs.aws.amazon.com/athena/latest/APIReference/API_QueryExecution.html#athena-Type-QueryExecution-StatementType) 파라미터는 `DDL`이 아닌 `UTILITY`로 분류됩니다.

## 시놉시스
<a name="synopsis"></a>

```
SHOW TABLES [IN database_name] ['regular_expression']
```

## 파라미터
<a name="parameters"></a>

**[IN database\$1name]**  
테이블을 나열할 `database_name`을 지정합니다. 생략하면 현재 컨텍스트의 데이터베이스로 가정됩니다.  
`database_name`에서 하이픈과 같이 [지원되지 않는 문자](tables-databases-columns-names.md)를 사용할 경우 `SHOW TABLES`가 실패할 수도 있습니다. 해결 방법으로 데이터베이스 이름을 백틱으로 묶어봅니다.

**['regular\$1expression']**  
지정한 `regular_expression`과 일치하는 기준으로 테이블 목록을 필터링합니다. `AWSDataCatalog` 테이블에서 문자를 나타내는 데 `*` 또는 `.*` 와일드카드 표현식을 사용할 수 있습니다. Apache Hive 데이터베이스의 경우 `.*` 와일드카드 표현식을 사용합니다. 문자 사이의 선택을 나타내려면 `|` 문자를 사용합니다.

## 예제
<a name="examples"></a>

**Example - `sampledb` 데이터베이스의 모든 테이블을 표시합니다**  

```
SHOW TABLES IN sampledb
```
`Results`  

```
alb_logs
cloudfront_logs
elb_logs
flights_2016
flights_parquet
view_2016_flights_dfw
```

**Example - “flights”라는 단어를 포함하는 `sampledb`의 모든 테이블 이름을 표시합니다**  

```
SHOW TABLES IN sampledb '*flights*'
```
`Results`  

```
flights_2016
flights_parquet
view_2016_flights_dfw
```

**Example - “logs”라는 단어로 끝나는 `sampledb`의 모든 테이블 이름을 표시합니다**  

```
SHOW TABLES IN sampledb '*logs'
```
`Results`  

```
alb_logs
cloudfront_logs
elb_logs
```

# SHOW TBLPROPERTIES
<a name="show-tblproperties"></a>

명명된 테이블의 테이블 속성을 나열합니다.

## 시놉시스
<a name="synopsis"></a>

```
SHOW TBLPROPERTIES table_name [('property_name')]
```

## 파라미터
<a name="parameters"></a>

**[('property\$1name')]**  
포함된 경우 `property_name`이라는 속성의 값만 나열됩니다.

## 예시
<a name="examples"></a>

```
SHOW TBLPROPERTIES orders;
```

```
SHOW TBLPROPERTIES orders('comment');
```

# SHOW VIEWS
<a name="show-views"></a>

Athena 또는 Data Catalog 뷰를 `STRING` 형식 값 목록에 나열합니다. 목록의 각 값은 지정된 데이터베이스의 뷰 또는 현재 데이터베이스(데이터베이스 이름이 생략된 경우)의 뷰 이름입니다. 선택적 `LIKE` 절을 정규식과 함께 사용하여 뷰 이름 목록을 제한합니다. Data Catalog 뷰의 경우 Athena SQL 구문을 사용하는 뷰만 나열됩니다. 다른 Data Catalog 뷰는 제외됩니다.

## 시놉시스
<a name="synopsis"></a>

```
SHOW VIEWS [IN database_name] [LIKE 'regular_expression']
```

### 파라미터
<a name="parameters"></a>

**[IN database\$1name]**  
뷰를 나열할 `database_name`을 지정합니다. 생략하면 현재 컨텍스트의 데이터베이스로 가정됩니다.

**[LIKE 'regular\$1expression']**  
지정한 `regular_expression`과 일치하는 기준으로 뷰 목록을 필터링합니다. 임의의 문자를 나타내는 `*` 와일드카드 또는 문자 사이의 선택을 나타내는 `|`만 사용할 수 있습니다.

## 예시
<a name="examples"></a>

```
SHOW VIEWS
```

```
SHOW VIEWS IN marketing_analytics LIKE 'orders*'
```

[SHOW COLUMNS](show-columns.md), [SHOW CREATE VIEW](show-create-view.md), [DESCRIBE VIEW](describe-view.md) 및 [DROP VIEW](drop-view.md)도 참조하세요.