타임스탬프 데이터 작업 - Amazon Athena

타임스탬프 데이터 작업

이 섹션에서는 Athena에서 타임스탬프 데이터를 작업할 때 고려해야 할 몇 가지 사항을 설명합니다.

참고

Athena 엔진 버전 2와 Athena 엔진 버전 3 사이에서 타임스탬프 처리가 조금 변경되었습니다. Athena 엔진 버전 3에서 발생할 수 있는 타임스탬프 관련 오류와 권장 솔루션은 Athena 엔진 버전 3 참조의 타임스탬프 변경 사항 섹션을 참조하세요.

Amazon S3 객체에 타임스탬프 데이터를 쓰기 위한 형식

Amazon S3 객체에 타임스탬프 데이터를 써야 하는 형식은 사용하는 SerDe 라이브러리와 열 데이터 형식 모두에 따라 달라집니다.

  • 테이블 열 형식이 DATE인 경우 Athena는 데이터의 해당 열 또는 속성을 ISO 형식 YYYY-MM-DD의 문자열이거나 Parquet 또는 ORC와 같은 기본 제공 날짜 유형으로 예상합니다.

  • 테이블 열 형식이 TIME인 경우 Athena는 데이터의 해당 열 또는 속성을 ISO 형식 HH:MM:SS의 문자열이거나 Parquet 또는 ORC와 같은 기본 제공 시간 유형으로 예상합니다.

  • 테이블 열 형식이 TIMESTAMP인 경우 Athena는 데이터의 해당 열 또는 속성을 YYYY-MM-DD HH:MM:SS.SSS 형식의 문자열(날짜 및 시간 사이의 공백에 주의)이거나 Parquet, ORC 또는 Ion과 같은 기본 제공 시간 유형으로 예상합니다. 참고로 Athena는 유효하지 않은 타임스탬프(예: 0000-00-00 08:00:00.000)에 대한 동작을 보장하지 않습니다.

    참고

    OpenCSVSerDe 타임스탬프는 예외이며, 밀리초 분해능의 UNIX 에포크로 인코딩해야 합니다.

시간을 기준으로 파티셔닝된 데이터가 레코드의 타임스탬프 필드와 일치하는지 확인

데이터 생성자는 파티션 값이 파티션 내 데이터에 맞게 조정되었는지 확인해야 합니다. 예를 들어 데이터에 timestamp 속성이 있고 Firehose를 사용하여 Amazon S3로 데이터를 로드하는 경우 Firehose의 기본 파티셔닝은 12시간 형식의 시간에 기반하므로 동적 파티셔닝을 사용해야 합니다.

파티션 키의 데이터 형식으로 문자열 사용

성능상의 이유로 파티션 키의 데이터 유형으로 STRING을 사용하는 것이 좋습니다. DATE 유형을 사용할 때 Athena는 YYYY-MM-DD 형식의 파티션 값을 날짜로 인식하지만 이 경우 성능이 저하될 수 있습니다. 이러한 이유로 대신 파티션 키에 STRING 데이터 형식을 사용하는 것이 좋습니다.

시간을 기준으로 파티셔닝된 타임스탬프 필드에 대한 쿼리를 작성하는 방법

시간을 기준으로 파티셔닝된 타임스탬프 필드에 대한 쿼리를 작성하는 방법은 쿼리하려는 테이블 유형에 따라 달라집니다.

Hive 테이블

Athena에서 가장 흔히 사용되는 Hive 테이블의 경우 쿼리 엔진은 열과 파티션 키 사이의 관계를 알지 못합니다. 따라서 항상 쿼리에 열과 파티션 키 모두에 대한 조건자를 추가해야 합니다.

예를 들어 event_time 열과 event_date 파티션 키가 있고 23:00 및 03:00 사이에 이벤트를 쿼리하려고 한다고 가정합니다. 이 경우 다음 예제와 같이 열과 파티션 키 모두에 대한 조건자를 쿼리에 포함해야 합니다.

WHERE event_time BETWEEN start_time AND end_time AND event_date BETWEEN start_time_date AND end_time_date

Iceberg 테이블

Iceberg 테이블을 사용하면 쿼리를 단순화하는 계산된 파티션 값을 사용할 수 있습니다. 예를 들어 Iceberg 테이블이 다음과 같은 PARTITIONED BY 절을 사용하여 생성되었다고 가정합니다.

PARTITIONED BY (event_date month(event_time))

이 경우 쿼리 엔진은 event_time 조건자 값을 기반으로 파티션을 자동으로 정리합니다. 따라서 다음 예제와 같이 쿼리에서는 event_time에 대한 조건자만 지정하면 됩니다.

WHERE event_time BETWEEN start_time AND end_time

자세한 내용은 Iceberg 테이블 생성 단원을 참조하십시오.