Athena는 S3에 있는 데이터를 바로 SQL로 질의하는 완전관리형(Serverless) 쿼리 서비스. 클러스터 만들 필요 없고, 스캔한 데이터 양만큼 과금되며, Glue Data Catalog의 스키마를 읽어 schema-on-read 방식으로 동작
Athena 엔진은 Presto/Trino 계열이라 표준 ANSI SQL을 대부분 사용 가능
쿼리 1번마다 스캔한 데이터 바이트 기준으로 과금(리전별 단가 상이).
스캔량 줄이는 게 = 비용/성능 최적화의 전부라고 봐도 돼요:
dt=YYYY-MM-DD, region=KR)ALTER TABLE ADD PARTITION, MSCK REPAIR TABLE, Partition Projection(동적 파티션)S3에 샘플 로그(예: s3://my-bucket/logs/dt=2025-10-10/...) 업로드
콘솔의 Athena → Query editor에서 Workgroup과 Query result location(S3) 설정
테이블 생성(DDL): (Glue에 등록)
CREATE EXTERNAL TABLE logs (
ts string,
user_id string,
action string,
meta map<string,string>
)
PARTITIONED BY (dt string)
STORED AS PARQUET
LOCATION 's3://my-bucket/logs/';
파티션 로드
MSCK REPAIR TABLE logs;
-- 또는
ALTER TABLE logs ADD PARTITION (dt='2025-10-10') LOCATION 's3://.../dt=2025-10-10/';
질의
SELECT dt, action, count(*) AS cnt
FROM logs
WHERE dt BETWEEN '2025-10-01' AND '2025-10-10'
GROUP BY 1,2
ORDER BY 1,2;
SELECT * 금지, 필요 컬럼만 선택WHERE dt='2025-10-10' 처럼 파티션 키에 조건 걸기HIVE_BAD_DATA 등 에러 → 샘플링 후 정확히 매핑json_extract/json_extract_scalar, 가능하면 Parquet로 변환| 요구사항 | 추천 |
|---|---|
| 즉석 SQL, 운영 부담 0, 파일 기반 분석 | Athena |
| 페타바이트급 웨어하우스, 복잡 ETL/조인/머터뷰 | Redshift / Redshift Serverless |
| 파이프라인/머신러닝/대규모 변환 | EMR(Spark) |
| 검색/로그 탐색, 실시간 인덱싱 | OpenSearch Service |
CSV → Parquet 변환(CTAS)
CREATE TABLE logs_parquet
WITH (
format='PARQUET',
write_compression='ZSTD',
partitioned_by=ARRAY['dt'],
external_location='s3://my-bucket/logs_parquet/'
) AS
SELECT ts, user_id, action, meta, dt
FROM logs
WHERE dt >= '2025-10-01';
쿼리 결과 S3로 내보내기(UNLOAD)
UNLOAD ('
SELECT user_id, count(*) AS cnt
FROM logs
WHERE dt = ''2025-10-10''
GROUP BY 1
')
TO 's3://my-bucket/export/users_20251010/'
WITH (format='PARQUET');