

# 2단계: 테이블 생성
<a name="step-2-create-a-table"></a>

이제 데이터베이스가 생겼으므로 이를 위한 Athena 테이블을 만들 수 있습니다. 생성하는 테이블은 `s3://athena-examples-myregion/cloudfront/plaintext/` 위치에 있는 샘플 Amazon CloudFront 로그 데이터를 기반으로 합니다. 여기서 *myregion*은 자신의 현재 AWS 리전입니다.

샘플 로그 데이터는 탭으로 구분된 값(TSV) 형식입니다. 즉, 필드를 구분하는 구분 기호로 탭 문자가 사용됩니다. 데이터는 다음 예제와 같습니다. 읽기 쉽도록 발췌 부분의 탭은 공백으로 변환되었고 마지막 필드는 줄였습니다.

```
2014-07-05 20:00:09 DFW3 4260 10.0.0.15 GET eabcd12345678.cloudfront.net /test-image-1.jpeg 200 - Mozilla/5.0[...]
2014-07-05 20:00:09 DFW3 4252 10.0.0.15 GET eabcd12345678.cloudfront.net /test-image-2.jpeg 200 - Mozilla/5.0[...]
2014-07-05 20:00:10 AMS1 4261 10.0.0.15 GET eabcd12345678.cloudfront.net /test-image-3.jpeg 200 - Mozilla/5.0[...]
```

Athena가 이 데이터를 읽도록 다음과 같이 직관적인 `CREATE EXTERNAL TABLE` 문을 만들 수 있습니다. 테이블을 생성하는 문으로 데이터에 매핑되는 열을 정의하고, 데이터의 구분 방식을 지정하고, 샘플 데이터가 포함되는 Amazon S3 위치를 지정합니다. Athena에서 폴더 내 모든 파일을 스캔할 것으로 예상하므로 `LOCATION` 절에서는 특정 파일이 아니라 Amazon S3 폴더 위치를 지정합니다.

이 예제에는 곧 설명하겠지만 중요한 제한 사항이 있으므로 아직 사용하지 마세요.

```
CREATE EXTERNAL TABLE IF NOT EXISTS cloudfront_logs (
  `Date` DATE,
  Time STRING,
  Location STRING,
  Bytes INT,
  RequestIP STRING,
  Method STRING,
  Host STRING,
  Uri STRING,
  Status INT,
  Referrer STRING,
  ClientInfo STRING
  ) 
  ROW FORMAT DELIMITED
  FIELDS TERMINATED BY '\t'
  LINES TERMINATED BY '\n'
  LOCATION 's3://athena-examples-my-region/cloudfront/plaintext/';
```

이 예제에서는 `cloudfront_logs`라는 테이블을 생성하고 각 필드의 이름과 데이터 유형을 지정합니다. 이러한 필드는 테이블의 열이 됩니다. `date`는 [예약된 단어](reserved-words.md#list-of-ddl-reserved-words)이므로 백틱(`) 문자로 이스케이프합니다. `ROW FORMAT DELIMITED`는 Athena가 [LazySimpleSerDe](lazy-simple-serde.md)라는 기본 라이브러리를 사용해 실제 데이터 구문 분석 작업을 수행할 것임을 의미합니다. 또한 이 예제에서는 필드를 탭(`FIELDS TERMINATED BY '\t'`)으로 구분하고 파일의 각 레코드가 줄 바꿈 문자(`LINES TERMINATED BY '\n`)로 끝나도록 지정합니다. 마지막으로 `LOCATION` 절은 읽어 올 실제 데이터가 위치한 Amazon S3의 경로를 지정합니다.

탭 또는 쉼표로 구분된 자체 데이터가 있는 경우 (필드에 중첩된 정보가 포함되지 않는 한) 방금 제시된 예제에서와 같이 `CREATE TABLE` 문을 사용할 수 있습니다. 하지만 다른 구분 기호를 사용하는 중첩된 정보가 포함된 `ClientInfo`와 같은 열이 있는 경우 다른 접근 방식이 필요합니다.

**ClientInfo 필드에서 데이터 추출**  
샘플 데이터를 살펴보면 여기에 최종 필드 `ClientInfo`의 전체 예제가 있습니다.

```
Mozilla/5.0%20(Android;%20U;%20Windows%20NT%205.1;%20en-US;%20rv:1.9.0.9)%20Gecko/2009040821%20IE/3.0.9
```

보시다시피 이 필드는 다중 값입니다. 예제인 `CREATE TABLE` 문에서 필드 구분 기호로 탭을 지정하기 때문에 `ClientInfo` 필드 내의 구성 요소를 별도의 열로 나눌 수 없습니다. 따라서 새 `CREATE TABLE` 문이 필요합니다.

`ClientInfo` 필드 내부의 값에서 열을 생성하기 위해 정규식 그룹을 포함한 [정규 표현식](https://en.wikipedia.org/wiki/Regular_expression)을 사용할 수 있습니다. 지정한 정규 표현식 그룹은 별도의 테이블 열이 됩니다. `CREATE TABLE` 문에 정규 표현식을 사용하려면 다음과 같은 구문을 사용합니다. 이 구문은 Athena에게 [Regex SerDe](regex-serde.md) 라이브러리와, 사용자가 지정한 정규 표현식을 사용하도록 지시합니다.

```
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.RegexSerDe'
  WITH SERDEPROPERTIES ("input.regex" = "regular_expression")
```

정규 표현식은 복잡한 CSV 또는 TSV 데이터에서 테이블을 만드는 데 유용하지만 작성하고 관리하기가 어려울 수 있습니다. 다행히 JSON, Parquet, ORC와 같은 형식을 사용할 수 있는 다른 라이브러리들이 있습니다. 자세한 내용은 [데이터에 적합한 SerDe 선택](supported-serdes.md) 단원을 참조하세요.

이제 Athena 쿼리 편집기에서 테이블을 생성할 준비가 되었습니다. 귀하를 위해 `CREATE TABLE` 문과 정규식이 제공되어 있습니다.

**Athena에서 테이블 생성**

1. 탐색 창에서 **데이터베이스(Database)**에 대해 `mydatabase`가 선택되어 있는지 확인합니다.

1. 쿼리 편집기에서 더 많은 공간을 확보하려면 화살표 아이콘을 선택하여 탐색 창을 축소합니다.  
![\[화살표를 선택하여 탐색 창을 축소합니다.\]](http://docs.aws.amazon.com/ko_kr/athena/latest/ug/images/getting-started-collapse-nav-pane.png)

1. 새로운 쿼리를 생성하려면 쿼리 편집기에서 더하기(**\$1**) 기호를 선택합니다. 한 번에 최대 10개의 쿼리 탭을 열 수 있습니다.  
![\[더하기 아이콘을 선택하여 새 쿼리 생성.\]](http://docs.aws.amazon.com/ko_kr/athena/latest/ug/images/getting-started-new-query-tab.png)

1. 하나 이상의 쿼리 탭을 닫으려면 더하기 기호 옆에 있는 화살표를 선택합니다. 모든 탭을 한 번에 닫으려면 화살표를 선택한 다음 **모든 탭 닫기(Close all tabs)**를 선택합니다.  
![\[화살표 아이콘을 선택하여 하나 이상의 쿼리 탭을 닫습니다.\]](http://docs.aws.amazon.com/ko_kr/athena/latest/ug/images/close-all-query-editor-tabs.png)

1. 쿼리 창에 다음 `CREATE EXTERNAL TABLE` 문을 입력합니다. 이 정규 표현식은 로그 데이터에 있는 `ClientInfo` 필드의 운영 체제, 브라우저 및 브라우저 버전 정보를 구분합니다.
**참고**  
다음 예제에 사용된 정규식은 `athena-examples` Amazon S3 위치에서 공개적으로 사용 가능한 샘플 CloudFront 로그 데이터와 함께 작동하도록 설계되었으며 설명을 위한 용도로만 제공되었습니다. 표준 및 실시간 CloudFront 로그 파일을 모두 쿼리하는 최신 정규 표현식에 대한 자세한 내용은 [Amazon CloudFront 로그 쿼리](cloudfront-logs.md) 섹션을 참조하세요.

   ```
   CREATE EXTERNAL TABLE IF NOT EXISTS cloudfront_logs (
     `Date` DATE,
     Time STRING,
     Location STRING,
     Bytes INT,
     RequestIP STRING,
     Method STRING,
     Host STRING,
     Uri STRING,
     Status INT,
     Referrer STRING,
     os STRING,
     Browser STRING,
     BrowserVersion STRING
     ) 
     ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.RegexSerDe'
     WITH SERDEPROPERTIES (
     "input.regex" = "^(?!#)([^ ]+)\\s+([^ ]+)\\s+([^ ]+)\\s+([^ ]+)\\s+([^ ]+)\\s+([^ ]+)\\s+([^ ]+)\\s+([^ ]+)\\s+([^ ]+)\\s+([^ ]+)\\s+[^\(]+[\(]([^\;]+).*\%20([^\/]+)[\/](.*)$"
     ) LOCATION 's3://athena-examples-myregion/cloudfront/plaintext/';
   ```

1. `LOCATION` 문에서 *myregion*을 현재 사용 중인 AWS 리전(예: `us-west-1`)으로 바꿉니다.

1. **실행**을 선택합니다.

   `cloudfront_logs` 테이블이 생성되어 `mydatabase` 데이터베이스의 **테이블** 목록에 나타납니다.