이제 데이터베이스가 생겼으므로 이를 위한 Athena 테이블을 만들 수 있습니다. 생성하는 테이블은 s3://athena-examples-
위치에 있는 샘플 Amazon CloudFront 로그 데이터를 기반으로 합니다. 여기서 myregion
/cloudfront/plaintext/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
는 예약된 단어이므로 백틱(`) 문자로 이스케이프합니다. ROW FORMAT DELIMITED
는 Athena가 LazySimpleSerDe라는 기본 라이브러리를 사용해 실제 데이터 구문 분석 작업을 수행할 것임을 의미합니다. 또한 이 예제에서는 필드를 탭(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
필드 내부의 값에서 열을 생성하기 위해 정규식 그룹을 포함한 정규 표현식CREATE TABLE
문에 정규 표현식을 사용하려면 다음과 같은 구문을 사용합니다. 이 구문은 Athena에게 Regex SerDe 라이브러리와, 사용자가 지정한 정규 표현식을 사용하도록 지시합니다.
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.RegexSerDe' WITH SERDEPROPERTIES ("input.regex" = "
regular_expression
")
정규 표현식은 복잡한 CSV 또는 TSV 데이터에서 테이블을 만드는 데 유용하지만 작성하고 관리하기가 어려울 수 있습니다. 다행히 JSON, Parquet, ORC와 같은 형식을 사용할 수 있는 다른 라이브러리들이 있습니다. 자세한 내용은 데이터에 적합한 SerDe 선택 단원을 참조하세요.
이제 Athena 쿼리 편집기에서 테이블을 생성할 준비가 되었습니다. 귀하를 위해 CREATE
TABLE
문과 정규식이 제공되어 있습니다.
Athena에서 테이블 생성
-
탐색 창에서 데이터베이스(Database)에 대해
mydatabase
가 선택되어 있는지 확인합니다. -
쿼리 편집기에서 더 많은 공간을 확보하려면 화살표 아이콘을 선택하여 탐색 창을 축소합니다.
-
새로운 쿼리를 생성하려면 쿼리 편집기에서 더하기(+) 기호를 선택합니다. 한 번에 최대 10개의 쿼리 탭을 열 수 있습니다.
-
하나 이상의 쿼리 탭을 닫으려면 더하기 기호 옆에 있는 화살표를 선택합니다. 모든 탭을 한 번에 닫으려면 화살표를 선택한 다음 모든 탭 닫기(Close all tabs)를 선택합니다.
-
쿼리 창에 다음
CREATE EXTERNAL TABLE
문을 입력합니다. 이 정규 표현식은 로그 데이터에 있는ClientInfo
필드의 운영 체제, 브라우저 및 브라우저 버전 정보를 구분합니다.참고
다음 예제에 사용된 정규식은
athena-examples
Amazon S3 위치에서 공개적으로 사용 가능한 샘플 CloudFront 로그 데이터와 함께 작동하도록 설계되었으며 설명을 위한 용도로만 제공되었습니다. 표준 및 실시간 CloudFront 로그 파일을 모두 쿼리하는 최신 정규 표현식에 대한 자세한 내용은 Amazon CloudFront 로그 쿼리 섹션을 참조하세요.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/'; -
LOCATION
문에서myregion
을 현재 사용 중인 AWS 리전(예:us-west-1
)으로 바꿉니다. -
Run(실행)을 선택합니다.
cloudfront_logs
테이블이 생성되어mydatabase
데이터베이스의 테이블 목록에 나타납니다.