Athena 엔진 버전 3 - Amazon Athena

Athena 엔진 버전 3

엔진 버전 3의 경우 Athena에서는 Athena 엔진 내에서 통합되고 조정되는 커뮤니티 개선 사항에 더 빠르게 액세스할 수 있도록 TrinoPresto 프로젝트로 동시성을 개선하는 지속적인 통합 접근 방식을 오픈 소스 소프트웨어 관리에 도입합니다.

이 Athena 엔진 버전 3 릴리스에서는 Athena 엔진 버전 2의 모든 기능을 지원합니다. 이 문서에서는 Athena 엔진 버전 2와 Athena 엔진 버전 3의 주요 차이점을 중심으로 설명합니다. 자세한 내용은 AWS 빅 데이터 블로그Upgrade to Athena engine version 3 to increase query performance and access more analytics features 문서를 참조하세요.

시작하기

시작하려면 Athena 엔진 버전 3을 사용하는 새 Athena 작업 그룹을 생성하거나 버전 3을 사용하도록 기존 작업 그룹을 구성하세요. Athena 작업 그룹에서는 쿼리를 제출하는 기능의 중단 없이 엔진 버전 2에서 엔진 버전 3으로 업그레이드할 수 있습니다.

자세한 내용은 Athena 엔진 버전 변경하기 섹션을 참조하세요.

개선 사항 및 새로운 기능

나열된 기능과 업데이트에는 Athena 자체 및 오픈 소스 Trino에서 통합된 기능의 개선 사항이 포함되어 있습니다. SQL 쿼리 연산자 및 함수의 전체 목록은 Trino 설명서를 참조하세요.

추가한 기능

Apache Spark 버킷팅 알고리즘 지원

Athena에서는 Spark 해시 알고리즘으로 생성한 버킷을 읽을 수 있습니다. 데이터를 원래 Spark 해시 알고리즘으로 작성했다고 지정하려면 CREATE TABLE 명령문의 TBLPROPERTIES 절에 ('bucketing_format'='spark')를 추가하세요. 이 속성을 지정하지 않으면 Hive 해시 알고리즘이 사용됩니다.

CREATE EXTERNAL TABLE `spark_bucket_table`( `id` int, `name` string ) CLUSTERED BY (`name`) INTO 8 BUCKETS STORED AS PARQUET LOCATION 's3://DOC-EXAMPLE-BUCKET/to/bucketed/table/' TBLPROPERTIES ('bucketing_format'='spark')

추가된 함수

이 섹션의 함수는 Athena 엔진 버전 3의 새로운 함수입니다.

집계 함수

listagg(x, separator) – 구분 기호 문자열로 구분된 연결된 입력 값을 반환합니다.

SELECT listagg(value, ',') WITHIN GROUP (ORDER BY value) csv_value FROM (VALUES 'a', 'c', 'b') t(value);

배열 함수

contains_sequence(x, seq) – 배열 x에 모든 배열 시퀀스가 순차적 하위 집합(동일한 연속 순서의 모든 값)으로 포함되면 true를 반환합니다.

SELECT contains_sequence(ARRAY [1,2,3,4,5,6], ARRAY[1,2]);

이진 함수

murmur3(binary) – 이진수의 128비트 MurmurHash3 해시를 계산합니다.

SELECT murmur3(from_base64('aaaaaa'));

변환 함수

format_number(number) – 단위 기호를 사용하는 형식이 지정된 문자열을 반환합니다.

SELECT format_number(123456); -- '123K'
SELECT format_number(1000000); -- '1M'

날짜 및 시간 함수

timezone_hour(timestamp) – 타임스탬프 중에서 시간대 오프셋의 시간을 반환합니다.

SELECT EXTRACT(TIMEZONE_HOUR FROM TIMESTAMP '2020-05-10 12:34:56 +08:35');

timezone_minute(timestamp) – 타임스탬프 중에서 시간대 오프셋의 분을 반환합니다.

SELECT EXTRACT(TIMEZONE_MINUTE FROM TIMESTAMP '2020-05-10 12:34:56 +08:35');

지리 공간 함수

to_encoded_polyline(Geometry) – 라인스트링 또는 다중점을 폴리라인에 인코딩합니다.

SELECT to_encoded_polyline(ST_GeometryFromText( 'LINESTRING (-120.2 38.5, -120.95 40.7, -126.453 43.252)'));

from_encoded_polyline(varchar) – 폴리라인을 라인스트링에 디코딩합니다.

SELECT ST_AsText(from_encoded_polyline('_p~iF~ps|U_ulLnnqC_mqNvxq`@'));

to_geojson_geometry(SphericalGeography) – GeoJSON 형식으로 지정된 구형 지리를 반환합니다.

SELECT to_geojson_geometry(to_spherical_geography(ST_GeometryFromText( 'LINESTRING (0 0, 1 2, 3 4)')));

from_geojson_geometry(varchar) – GeoJSON 표현에서 지오메트리가 아닌 키/값을 제거한 구형 지리 유형 객체를 반환합니다. FeatureFeatureCollection은 지원되지 않습니다.

SELECT from_geojson_geometry(to_geojson_geometry(to_spherical_geography(ST_GeometryFromText( 'LINESTRING (0 0, 1 2, 3 4)'))));

geometry_nearest_points(Geometry, Geometry) – 각 지오메트리에서 서로 가장 가까운 점을 반환합니다. 지오메트리가 하나라도 비어 있으면 null을 반환합니다. 그렇지 않으면 지오메트리에 두 점의 최소 거리가 있는 두 Point 객체의 행을 반환합니다. 첫 번째 점은 첫 번째 Geometry 인수, 두 번째 점은 두 번째 Geometry 인수에서 나옵니다. 최소 거리가 동일한 쌍이 여러 개 있는 경우 한 쌍을 임의로 선택합니다.

SELECT geometry_nearest_points(ST_GeometryFromText( 'LINESTRING (50 100, 50 200)'), ST_GeometryFromText( 'LINESTRING (10 10, 20 20)'));

다이제스트 함수 설정

make_set_digest(x) – x의 모든 입력 값을 세트 setdigest에 작성합니다.

SELECT make_set_digest(value) FROM (VALUES 1, 2, 3) T(value);

문자열 함수

soundex(char) – char의 음성 표현이 포함된 문자열을 반환합니다.

SELECT name FROM nation WHERE SOUNDEX(name) = SOUNDEX('CHYNA'); -- CHINA

concat_ws(string0, string1, ..., stringN)string0을 구분 기호로 사용하는 string1, string2, ..., stringN의 연결을 반환합니다. string0이 null이면 반환 값도 null입니다. 구분 기호 뒤의 인수에서 제공되는 null 값은 건너뜁니다.

SELECT concat_ws(',', 'def', 'pqr', 'mno');

윈도 함수

GROUPS – 그룹 기반 창 프레임에 대한 지원을 추가합니다.

SELECT array_agg(a) OVER( ORDER BY a ASC NULLS FIRST GROUPS BETWEEN 1 PRECEDING AND 2 FOLLOWING) FROM (VALUES 3, 3, 3, 2, 2, 1, null, null) T(a);

성능 개선

Athena 엔진 버전 3의 성능 개선 사항에는 다음이 포함됩니다.

  • 더 빠른 AWS Glue 테이블 메타데이터 검색 – 여러 테이블을 포함하는 쿼리에서 쿼리 계획 시간이 단축됩니다.

  • RIGHT JOIN에 대한 동적 필터링 – 이제 다음 예와 같이 등가 조인 조건이 있는 오른쪽 조인에 대해 동적 필터링이 활성화됩니다.

    SELECT * FROM lineitem RIGHT JOIN tpch.tiny.supplier ON lineitem.suppkey = supplier.suppkey WHERE supplier.name = 'abc';
  • 대량으로 준비된 명령문 – 명령문이 대량으로 준비되도록 기본 HTTP 요청/응답 헤더 크기를 2MB로 늘렸습니다.

  • approx_percentile() - 이제 approx_percentile 함수는 분산에서 대략적인 분위수 값을 검색하기 위해 qdigest 대신 tdigest를 사용합니다. 그 결과 성능은 향상되고 메모리 사용량이 줄어듭니다. 이 변경으로 인해 함수는 Athena 엔진 버전 2에서 반환했던 것과 다른 결과를 반환합니다. 자세한 내용은 approx_percentile 함수는 다른 결과를 반환합니다. 단원을 참조하십시오.

신뢰성 향상 기능

Athena 엔진 버전 3의 일반 엔진 메모리 사용량 및 추적이 개선되었습니다. 대규모 쿼리가 노드 충돌로 인한 실패에 덜 취약합니다.

쿼리 구문 향상 기능

INTERSECT ALLINTERSECT ALL에 대한 지원을 추가했습니다.

SELECT * FROM (VALUES 1, 2, 3, 4) INTERSECT ALL SELECT * FROM (VALUES 3, 4);

EXCEPT ALLEXCEPT ALL에 대한 지원을 추가했습니다.

SELECT * FROM (VALUES 1, 2, 3, 4) EXCEPT ALL SELECT * FROM (VALUES 3, 4);

RANGE PRECEDING – 창 함수의 RANGE PRECEDING에 대한 지원을 추가했습니다.

SELECT sum(x) over (order by x range 1 preceding) FROM (values (1), (1), (2), (2)) t(x);

MATCH_RECOGNIZE – 다음 예와 같이 행 패턴 일치에 대한 지원을 추가했습니다.

SELECT m.id AS row_id, m.match, m.val, m.label FROM (VALUES(1, 90),(2, 80),(3, 70),(4, 70)) t(id, value) MATCH_RECOGNIZE ( ORDER BY id MEASURES match_number() AS match, RUNNING LAST(value) AS val, classifier() AS label ALL ROWS PER MATCH AFTER MATCH SKIP PAST LAST ROW PATTERN (() | A) DEFINE A AS true ) AS m;

데이터 형식 및 데이터 유형 향상 기능

Athena 엔진 버전 3에서는 다음과 같은 데이터 형식과 데이터 유형이 향상되었습니다.

  • LZ4 및 ZSTD – LZ4 및 ZSTD 압축 Parquet 데이터 읽기에 대한 지원을 추가했습니다. ZSTD 압축 ORC 데이터 쓰기에 대한 지원을 추가했습니다.

  • 심볼릭 링크 기반 테이블 – Avro 파일의 심볼릭 링크 기반 테이블 생성에 대한 지원을 추가했습니다. 예를 들면 다음과 같습니다.

    CREATE TABLE test_avro_symlink ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.avro.AvroSerDe' ... INPUTFORMAT 'org.apache.hadoop.hive.ql.io.SymlinkTextInputFormat'
  • SphericalGeography – SphericalGeography 유형에서는 지리적 좌표 (측지 좌표, 위도/경도 또는 경도/위도라고도 함)에 표시되는 공간 형상에 대한 기본 지원을 제공합니다. 지리적 좌표는 각도 단위(도)로 표현된 구면 좌표입니다.

    to_spherical_geography 함수에서는 다음 예와 같이 기하(평면) 좌표 중에서 지리(구면) 좌표를 반환합니다.

    SELECT to_spherical_geography(ST_GeometryFromText( 'LINESTRING (-40.2 28.9, -40.2 31.9, -37.2 31.9)'));

호환성에 영향을 미치는 변경

Athena 엔진 버전 2에서 Athena 엔진 버전 3으로 마이그레이션하는 경우 특정 변경 사항이 테이블 스키마, 구문 또는 데이터 유형 사용량에 영향을 미칠 수 있습니다. 이 섹션에서는 관련 오류 메시지를 나열하고 권장 해결 방법을 제공합니다.

쿼리 구문 변경 사항

IGNORE NULLS는 value가 아닌 창 함수와 함께 사용할 수 없음

오류 메시지: Cannot specify null treatment clause for bool_or function.

원인: 이제 value 함수 first_value, last_value, nth_value, lead, lag에서만 IGNORE NULLS를 사용할 수 있습니다. ANSI SQL 사양을 준수하도록 변경되었습니다.

권장 솔루션: value가 아닌 창 함수에서 쿼리 문자열에 있는 IGNORE NULLS를 제거합니다.

CONCAT 함수에는 두 개 이상의 인수가 있어야 함

오류 메시지: INVALID_FUNCTION_ARGUMENT: There must be two or more concatenation arguments(INVALID_FUNCTION_ARGUMENT: 두 개 이상의 연결 인수가 있어야 합니다)

원인: 이전에는 CONCAT 문자열 함수에서 단일 인수를 허용했습니다. Athena 엔진 버전 3에서는 CONCAT 함수에 최소 두 개의 인수가 필요합니다.

권장 솔루션: CONCAT(str) 항목을 CONCAT(str, '')로 변경합니다.

Athena 엔진 버전 3에서는 함수 인수가 127개를 초과할 수 없습니다. 자세한 내용은 함수 호출에 사용하는 인수가 너무 많음 단원을 참조하십시오.

approx_percentile 함수는 다른 결과를 반환합니다.

approx_percentile 함수는 Athena 엔진 버전 3에서 Athena 엔진 버전 2와는 다른 결과를 반환합니다.

오류 메시지: 없습니다.

원인: approx_percentile 함수는 버전 변경의 영향을 받습니다.

중요

approx_percentile 함수의 출력은 근사치이고 근사치는 버전마다 변경될 수 있으므로 중요한 애플리케이션에서는 approx_percentile 함수에 의존해서는 안 됩니다.

권장 솔루션: Athena 엔진 버전 2에서 approx_percentile의 동작에 대한 근사치를 구하려는 경우 Athena 엔진 버전 3에서 다른 함수 세트를 사용할 수 있습니다. 예를 들어 Athena 엔진 버전 2에서 다음 쿼리를 가정합니다.

SELECT approx_percentile(somecol, 2E-1)

Athena 엔진 버전 3에서 동일한 출력의 근사치를 구하려면 다음 예제와 같이 qdigest_aggvalue_at_quantile 함수를 사용할 수 있습니다. 단, 이 해결 방법을 사용하더라도 동일한 동작이 보장되지는 않습니다.

SELECT value_at_quantile(qdigest_agg(somecol, 1), 2E-1)

지리 공간 함수에서 varbinary 입력이 지원되지 않음

오류 메시지: FUNCTION_NOT_FOUND for st_XXX(st_XXX에 대한 FUNCTION_NOT_FOUND)

원인: 몇 가지 지리 공간 함수에서 더는 이상 기존 VARBINARY 입력 유형 또는 텍스트 관련 함수 서명을 지원하지 않습니다.

권장 솔루션: 지리 공간 함수를 사용하여 입력 유형을 지원되는 유형으로 변환합니다. 지원되는 입력 유형은 오류 메시지에 표시됩니다.

GROUP BY 절에서 중첩된 열은 큰따옴표로 묶어야 합니다.

오류 메시지: "column_name"."nested_column" must be an aggregate expression or appear in GROUP BY clause

원인: Athena 엔진 버전 3에서는 GROUP BY 절의 중첩된 열 이름을 큰따옴표로 묶어야 합니다. 예를 들어 다음 쿼리에서는 GROUP BY 절에서 user.name이 큰따옴표로 묶여 있지 않기 때문에 오류가 발생합니다.

SELECT "user"."name" FROM dataset GROUP BY user.name

권장 솔루션: 다음 예제와 같이 GROUP BY 절의 중첩된 열 이름을 큰따옴표를 묶습니다.

SELECT "user"."name" FROM dataset GROUP BY "user"."name"

Iceberg 테이블에서 OPTIMIZE를 사용할 때 예기치 않은 FilterNode 오류 발생

오류 메시지: 계획에서 예상치 못한 FilterNode가 발견되었으며, 커넥터가 제공된 WHERE 표현식을 처리하지 못한 것 같습니다.

원인: Iceberg 테이블에서 실행된 OPTIMIZE 문은 필터 표현식에 파티션되지 않은 열을 포함하는 WHERE 절을 사용했습니다.

권장 해결 방법: 이 OPTIMIZE 문은 파티션별 필터링만 지원합니다. 파티션 테이블에서 OPTIMIZE를 실행할 때는 파티션 열만 WHERE 절에 포함하세요. 파티션되지 않은 테이블에서 OPTIMIZE를 실행하는 경우 WHERE 절을 지정하지 마세요.

Log() 함수 인수 순서

Athena 엔진 버전 2에서는 log() 함수의 인수 순서가 log(value, base)였습니다. Athena 엔진 버전 3에서는 SQL 표준에 따라 log(base, value)로 변경되었습니다.

Minute() 함수에서 연도-달 간격이 지원되지 않음

오류 메시지: Unexpected parameters (interval year to month) for function minute(함수 minute에 대한 예기치 않은 파라미터(연도-달 간격)입니다). 예상: minute(시간대 포함 타임스탬프), minute(시간대 포함 시간), minute(타임스탬프), minute(시간), minute(일-초 간격).

원인: Athena 엔진 버전 3에서는 ANSI SQL 사양에 따라 형식 검사가 EXTRACT에 더 정밀하게 적용되었습니다.

권장 솔루션: 유형이 권한 함수 서명과 일치하도록 쿼리를 업데이트합니다.

ORDER BY 표현식이 SELECT 목록에 나타나야 함

오류 메시지: For SELECT DISTINCT, ORDER BY expressions must appear in SELECT list(SELECT DISTINCT의 경우 ORDER BY 표현식이 SELECT 목록에 나타나야 합니다).

원인: SELECT 절에서 잘못된 테이블 별칭 지정이 사용되었습니다.

권장 솔루션: ORDER BY 표현식의 모든 열에 SELECT DISTINCT 절의 적절한 참조가 있는지 다시 확인합니다.

하위 쿼리에서 반환된 여러 열을 비교할 때 쿼리 실패

오류 메시지 예제: Value expression and result of subquery must be of the same type: row(varchar, varchar) vs row(row(varchar, varchar))

원인: Athena 엔진 버전 3에서 구문 업데이트로 인해 다음 예제와 같이 쿼리가 하위 쿼리에서 반환된 여러 값을 비교하려고 할 때 하위 쿼리의 SELECT 문이 해당 열 목록을 괄호로 묶으면 이 오류가 발생합니다.

SELECT * FROM table1 WHERE (t1_col1, t1_col2) IN (SELECT (t2_col1, t2_col2) FROM table2)

해결 방법: Athena 엔진 버전 3에서는 다음과 같이 업데이트된 쿼리 예제와 같이 하위 쿼리의 SELECT 문에서 열 목록을 묶은 괄호를 제거합니다.

SELECT * FROM table1 WHERE (t1_col1, t1_col2) IN (SELECT t2_col1, t2_col2 FROM table2)

SKIP은 DML 쿼리의 예약어임

SKIP이라는 단어는 이제 SELECT와 같은 DML 쿼리의 예약어입니다. DML 쿼리에서 SKIP을 식별자로 사용하려면 큰따옴표로 묶습니다.

Athena의 예약어에 대한 자세한 내용은 예약어 섹션을 참조하세요.

SYSTEM_TIME 및 SYSTEM_VERSION 절은 시간 이동에 더 이상 사용되지 않습니다.

오류 메시지: mismatched input 'SYSTEM_TIME'(입력 'SYSTEM_TIME'이 일치하지 않습니다). 예상: 'TIMESTAMP', 'VERSION'

원인: Athena 엔진 버전 2의 Iceberg 테이블에서 타임스탬프 및 버전 시간 이동에 FOR SYSTEM_TIME AS OFFOR SYSTEM_VERSION AS OF 절을 사용했습니다. Athena 엔진 버전 3에서는 FOR TIMESTAMP AS OFFOR VERSION AS OF 절을 사용합니다.

권장 솔루션: 다음 예와 같이 시간 이동 작업에 TIMESTAMP AS OFVERSION AS OF 절을 사용하도록 SQL 쿼리를 업데이트합니다.

타임스탬프별 시간 이동:

SELECT * FROM TABLE FOR TIMESTAMP AS OF (current_timestamp - interval '1' day)

버전별 시간 이동:

SELECT * FROM TABLE FOR VERSION AS OF 949530903748831860

배열 생성자에 대한 인수가 너무 많음

오류 메시지: TOO_MANY_ARGUMENTS: Too many arguments for array constructor.

원인: 이제 배열 생성자의 최대 요소 수가 254개로 설정됩니다.

권장 솔루션: 다음 예제와 같이 요소 수가 각각 254개 이하인 여러 배열로 나누고 CONCAT 함수를 사용하여 배열을 연결합니다.

CONCAT( ARRAY[x1,x2,x3...x254], ARRAY[y1,y2,y3...y254], ... )

길이가 0으로 구분된 식별자는 허용되지 않음

오류 메시지: Zero-length delimited identifier not allowed(길이가 0으로 구분된 식별자는 허용되지 않습니다).

원인: 쿼리에서 빈 문자열을 열 별칭으로 사용했습니다.

권장 솔루션: 쿼리를 업데이트하여 열에 비어 있지 않은 별칭을 사용합니다.

데이터 처리 변경 사항

버킷 검증

오류 메시지: HIVE_INVALID_BUCKET_FILES: Hive table is corrupt.

원인: 테이블이 손상되었을 수 있습니다. 버킷 테이블의 쿼리 정확성을 보장하기 위해 Athena 엔진 버전 3에서는 버킷 테이블에서 추가 검증을 활성화하여 쿼리의 정확성을 보장하고 런타임 시 예상치 못한 오류를 방지합니다.

권장 솔루션: Athena 엔진 버전 3을 사용하여 테이블을 다시 생성합니다.

struct를 JSON으로 캐스팅하면 이제 필드 이름이 반환됨

Athena 엔진 버전 3의 SELECT 쿼리에서 struct를 JSON으로 캐스팅하면 이제 캐스팅이 필드 이름과 값을 모두 반환합니다(예: 그냥 값 대신 "useragent":null(예: null)).

Iceberg 테이블 열 수준 보안 적용 변경

오류 메시지: Access Denied: Cannot select from columns(액세스 거부됨: 열에서 선택할 수 없습니다)

원인: Iceberg 테이블이 Athena 외부에서 생성되고 Apache Iceberg SDK 0.13.0 이전 버전을 사용합니다. 이전 SDK 버전에서는 AWS Glue의 열이 채워지지 않으므로 Lake Formation에서는 액세스 권한이 부여된 열을 확인할 수 없습니다.

권장 솔루션: Athena ALTER TABLE SET PROPERTIES 문을 사용하여 업데이트를 수행하거나 최신 Iceberg SDK를 사용하여 테이블을 수정하고 AWS Glue에서 열 정보를 업데이트합니다.

List 데이터 유형의 Null이 이제 UDF로 전파됨

오류 메시지: Null Pointer Exception(Null 포인터 예외)

원인: 이 문제는 UDF 커넥터를 사용하고 사용자 정의 Lambda 함수를 구현한 경우 영향을 미칠 수 있습니다.

Athena 엔진 버전 2에서는 사용자 정의 함수에 전달된 List 데이터 유형의 null을 필터링했습니다. Athena 엔진 버전 3에서는 이제 null이 보존되고 UDF로 전달됩니다. 이로 인해 UDF에서 확인하지 않고 null 요소 역참조를 시도하면 null 포인터 예외가 발생할 수 있습니다.

예를 들면 DynamoDB와 같은 원래 데이터 소스에 [null, 1, null, 2, 3, 4] 데이터가 있는 경우 사용자 정의 Lambda 함수에 다음과 같이 전달됩니다.

Athena 엔진 버전 2: [1,2,3,4]

Athena 엔진 버전 3: [null, 1, null, 2, 3, 4]

권장 솔루션: 사용자 정의 Lambda 함수가 목록 데이터 유형의 null 요소를 처리하는지 확인합니다.

문자형 배열의 하위 문자열에 더는 패딩된 공백이 포함되지 않음

오류 메시지: 오류는 발생하지 않지만, 반환된 문자열에 더는 패딩된 공백이 포함되지 않습니다. 예를 들면 substr(char[20],1,100)에서 이제는 길이가 100이 아니라 20인 문자열을 반환합니다.

권장 솔루션: 조치가 필요하지 않습니다.

지원되지 않는 10진수 열 유형 강제 변환

오류 메시지: HIVE_CURSOR_ERROR: Failed to read Parquet file: s3://DOC-EXAMPLE-BUCKET/path/file_name.parquet 또는 Unsupported column type (varchar) for Parquet column ([column_name]

원인: Athena 엔진 버전 2에서는 데이터 형식을 varchar에서 10진수로 강제 변환하려고 할 때 성공하기도 하지만 실패하는 경우가 더 빈번합니다. Athena 엔진 버전 3에서는 값을 읽으려고 하기 전에 유형이 호환되는지 확인하는 유형 검증 기능을 제공하므로 이러한 강제 변환 시도는 이제 항상 실패합니다.

권장 솔루션: Athena 엔진 버전 2와 Athena 엔진 버전 3 모두에서 Parquet 파일의 10진수 열에 대해 varchar 대신 숫자 데이터 형식을 사용하도록 AWS Glue에서 스키마를 수정합니다. 데이터를 다시 크롤링하고 새 열 데이터 형식이 10진수 유형인지 확인하거나 Athena에서 테이블을 수동으로 다시 생성하고 decimal(precision, scale) 구문을 사용하여 열에 대해 decimal 데이터 형식을 지정합니다.

부동 또는 double NaN 값은 더 이상 bigint로 변환할 수 없음

오류 메시지: INVALID_CAST_ARGUMENT: Cannot cast real/double NaN to bigint

원인: Athena 엔진 버전 3에서는 NaN을 더 이상 bigint와 같은 0으로 변환할 수 없습니다.

권장 솔루션: bigint로 변환할 때 float 또는 double 열에 NaN 값이 없는지 확인합니다.

uuid() 함수 반환 유형 변경

다음 문제는 테이블 및 보기에 모두 영향을 줍니다.

오류 메시지: Unsupported Hive type: uuid

원인: Athena 엔진 버전 2에서 uuid() 함수는 문자열을 반환했지만 Athena 엔진 버전 3에서는 무작위로 생성된 유사 UUID(유형 4)를 반환합니다. Athena에서 UUID 열 데이터 형식은 지원되지 않으므로 Athena 엔진 버전 3에서 UUID 열을 생성하기 위해 CTAS 쿼리에서 더 이상 uuid() 함수를 직접 사용할 수 없습니다.

예를 들어 다음 CREATE TABLE 문은 Athena 엔진 버전 2에서는 성공적으로 완료되지만 Athena 엔진 버전 3에서는 NOT_SUPPORTED: Unsupported Hive type: uuid를 반환합니다.

CREATE TABLE uuid_table AS SELECT uuid() AS myuuid

마찬가지로 다음 CREATE VIEW 문은 Athena 엔진 버전 2에서는 성공적으로 완료되지만 Athena 엔진 버전 3에서는 Invalid column type for column myuuid: Unsupported Hive type: uuid를 반환합니다.

CREATE VIEW uuid_view AS SELECT uuid() AS myuuid

Athena 엔진 버전 2에서 생성된 보기를 Athena 엔진 버전 3에서 쿼리하면 다음과 같은 오류가 발생합니다.

VIEW_IS_STALE: line 1:15: View 'awsdatacatalog.mydatabase.uuid_view' is stale or in invalid state: column [myuuid] of type uuid projected from query view at position 0 cannot be coerced to column [myuuid] of type varchar stored in view definition

권장 솔루션: 테이블 또는 보기를 생성하는 경우 다음 예제와 같이 cast() 함수를 사용하여 uuid()의 출력을 varchar로 변환합니다.

CREATE TABLE uuid_table AS SELECT CAST(uuid() AS VARCHAR) AS myuuid
CREATE VIEW uuid_view AS SELECT CAST(uuid() AS VARCHAR) AS myuuid

CHAR 및 VARCHAR 강제 변환 문제

Athena 엔진 버전 3에서 varcharchar 관련 강제 변환 문제가 발생하는 경우 이 섹션의 해결 방법을 사용합니다. 이 해결 방법을 사용할 수 없는 경우 AWS Support에 문의하세요.

CHAR 및 VARCHAR 입력이 혼합된 상태에서 CONCAT 함수 실패

문제: Athena 엔진 버전 2에서는 다음 쿼리에 성공합니다.

SELECT concat(CAST('abc' AS VARCHAR(20)), '12', CAST('a' AS CHAR(1)))

하지만 Athena 엔진 버전 3에서는 다음과 같이 동일한 쿼리에 실패합니다.

오류 메시지: FUNCTION_NOT_FOUND: line 1:8: Unexpected parameters (varchar(20), varchar(2), char(1)) for function concat. Expected: concat(char(x), char(y)), concat(array(E), E) E, concat(E, array(E)) E, concat(array(E)) E, concat(varchar), concat(varbinary)

권장 솔루션: concat 함수를 사용하는 경우 char 또는 varchar를 혼합하지 않고 둘 중 하나로만 변환합니다.

CHAR 및 VARCHAR 입력에서 SQL || 연결 실패

Athena 엔진 버전 3에서는 이중 수직 막대 || 연결 연산자를 사용하려면 가 입력으로 varchar를 사용해야 합니다. varcharchar 유형의 조합을 입력으로 사용할 수는 없습니다.

오류 메시지: TYPE_NOT_FOUND: line 1:26: Unknown type: char(65537)

원인: 다음 예제와 같이 charvarchar를 연결하기 위해 ||를 사용하는 쿼리에서 오류가 발생할 수 있습니다.

SELECT CAST('a' AS CHAR) || CAST('b' AS VARCHAR)

권장 솔루션: 다음 예제와 같이 varcharvarchar에 연결합니다.

SELECT CAST('a' AS VARCHAR) || CAST('b' AS VARCHAR)
CHAR 및 VARCHAR UNION 쿼리 실패

오류 메시지: NOT_SUPPORTED: Unsupported Hive type: char(65536). 지원되는 CHAR 유형: CHAR(<=255)

원인: 다음 예제와 같이 charvarchar를 결합하려고 시도하는 쿼리가 원인입니다.

CREATE TABLE t1 (c1) AS SELECT CAST('a' as CHAR) as c1 UNION ALL SELECT CAST('b' AS VARCHAR) AS c1

권장 솔루션: 쿼리 예제와 같이char 대신 'a'varchar로 변환합니다.

CHAR 또는 VARCHAR 강제 변환 후 불필요한 빈 공백

Athena 엔진 버전 3에서 배열 또는 단일 열을 구성할 때 char(X)varchar 데이터를 단일 유형으로 변환하는 경우 char(65535)가 대상 유형이고 각 필드는 불필요한 후행 공백을 여러 개 포함합니다.

원인: Athena 엔진 버전 3에서 varcharchar(X)char(65535)로 강제 변환한 후 데이터 오른쪽을 공백으로 채웁니다.

권장 솔루션: 각 필드를 명시적으로 varchar로 변환합니다.

타임스탬프 변경 사항

varchar 동작 변경에 시간대 포함 타임스탬프 캐스팅

Athena 엔진 버전 2에서는 varchar에 시간대 포함 Timestamp를 캐스팅하면 일부 시간대 리터럴이 변경되었습니다(예: US/EasternAmerica/New_York으로 변경됨). Athena 엔진 버전 3에서는 이 동작이 발생하지 않습니다.

날짜 타임스탬프 오버플로 오류 발생

오류 메시지: Millis overflow: XXX(밀리초 오버플로: XXX)

원인: Athena 엔진 버전 2에서는 ISO 8601 날짜의 오버플로를 확인하지 않았기 때문에 일부 날짜에서 음수 타임스탬프가 생성되었습니다. Athena 엔진 버전 3에서는 이 오버플로를 확인하고 예외를 발생시킵니다.

권장 솔루션: 타임스탬프가 범위 내에 있는지 확인합니다.

TIME이 지원되지 않는 정치적 시간대

오류 메시지: INVALID LITERAL

원인: 쿼리(예: SELECT TIME '13:21:32.424 America/Los_Angeles').

권장 솔루션: TIME에 정치적 시간대를 함께 사용하지 않습니다.

타임스탬프 열의 정밀도 불일치로 직렬화 오류 발생

오류 메시지: SERIALIZATION_ERROR: Could not serialize column 'COLUMNZ' of type 'timestamp(3)' at position X:Y(SERIALIZATION_ERROR: 위치 X:Y의 유형 'timestamp(3)'의 열 'COLUMNZ'는 직렬화할 수 없습니다).

COLUMNZ는 문제의 원인이 되는 열의 출력 이름입니다. 숫자 X: Y는 출력에서 열의 위치를 나타냅니다.

원인: Athena 엔진 버전 3에서는 데이터의 타임스탬프의 정밀도가 테이블 사양의 열 데이터 유형에 지정된 정밀도와 동일한지 확인합니다. 현재 이 정밀도는 항상 3입니다. 데이터의 정밀도가 이보다 크면 쿼리가 실패하고 오류가 표시됩니다.

권장 솔루션: 데이터를 검사하여 타임스탬프의 정밀도가 밀리초 단위인지 확인합니다.

Iceberg 테이블에 대한 UNLOAD 및 CTAS 쿼리의 타임스탬프 정밀도가 잘못됨

오류 메시지: Incorrect timestamp precision for timestamp(6); the configured precision is MILLISECONDS

원인: Athena 엔진 버전 3에서는 데이터의 타임스탬프의 정밀도가 테이블 사양의 열 데이터 형식에 지정된 정밀도와 동일한지 확인합니다. 현재 이 정밀도는 항상 3입니다. 데이터의 정밀도가 이보다 큰 경우(예: 밀리초 대신 마이크로초) 쿼리에 실패하고 오류가 기록될 수 있습니다.

해결 방법: 이 문제를 해결하려면 먼저 Iceberg 테이블을 생성하는 다음 CTAS 예제에서처럼 타임스탬프 정밀도를 6으로 변환(CAST)합니다. Timestamp precision (3) not supported for Iceberg 오류가 발생하지 않도록 하려면 정밀도를 3 대신 6으로 지정해야 합니다.

CREATE TABLE my_iceberg_ctas WITH (table_type = 'ICEBERG', location = 's3://DOC-EXAMPLE-BUCKET/table_ctas/', format = 'PARQUET') AS SELECT id, CAST(dt AS timestamp(6)) AS "dt" FROM my_iceberg

Athena는 타임스탬프 6을 지원하지 않으므로 값을 다시 타임스탬프로 변환합니다(예: 보기에서와 같이). 다음 예제에서는 my_iceberg_ctas 테이블에서 보기를 생성합니다.

CREATE OR REPLACE VIEW my_iceberg_ctas_view AS SELECT cast(dt AS timestamp) AS dt FROM my_iceberg_ctas

ORC 파일의 Timestamp로 Long 유형을 읽거나 반대의 경우 이제는 잘못된 형식의 ORC 파일 오류 발생

오류 메시지: Error opening Hive split ‘FILE (SPLIT POSITION)’ Malformed ORC file.(Hive 분할 ‘FILE(SPLIT POSITION)’ 형식이 잘못된 ORC 파일을 여는 동안 오류가 발생했습니다). Cannot read SQL type timestamp from ORC stream .long_type of type LONG(LONG 유형의 ORC 스트림 .long_type에서 SQL 유형 타임스탬프를 읽을 수 없습니다.)

원인: 이제 Athena 엔진 버전 3에서는 Long 데이터 형식에서 Timestamp로 또는 Timestamp에서 Long으로 암시적 강제 변환을 거부합니다. 이전에는Long 값이 Epoch 밀리초였던 것처럼 암시적으로 타임스탬프로 변환되었습니다.

권장 솔루션: from_unixtime 함수를 사용하여 열을 명시적으로 캐스팅하거나 from_unixtime 함수를 사용하여 향후 쿼리를 위한 추가 열을 생성합니다.

시간 및 연도-달 간격은 지원되지 않음

오류 메시지: TYPE MISMATCH

원인: Athena 엔진 버전 3에서는 시간 및 연도-달 간격을 지원하지 않습니다(예: SELECT TIME '01:00' + INTERVAL '3' MONTH).

int96 Parquet 형식의 타임스탬프 오버플로

오류 메시지: Invalid timeOfDayNanos(잘못된 timeOfDayNanos)

원인: int96 Parquet 형식의 타임스탬프 오버플로입니다.

권장 솔루션: 문제가 있는 특정 파일을 식별합니다. 그런 다음에 잘 알려진 최신 Parquet 라이브러리로 데이터 파일을 다시 생성하거나 Athena CTAS를 사용합니다. 문제가 지속되면 Athena 지원팀에 연락하여 데이터 파일이 어떻게 생성되는지 알려주세요.

문자열에서 타임스탬프로 변환할 때 날짜와 시간 값 사이에 공백이 필요함

오류 메시지: INVALID_CAST_ARGUMENT: Value cannot be cast to timestamp.

원인: Athena 엔진 버전 3에서는 cast에 대한 입력 문자열에서 날짜와 시간 값 사이의 유효한 구분 기호로 더 이상 하이픈을 허용하지 않습니다. 예를 들어 다음 쿼리는 Athena 엔진 버전 2에서는 작동하지만 Athena 엔진 버전 3에서는 작동하지 않습니다.

SELECT CAST('2021-06-06-23:38:46' AS timestamp) AS this_time

권장 솔루션: Athena 엔진 버전 3에서는 다음 예제와 같이 날짜 및 시간 사이의 하이픈을 공백으로 바꿉니다.

SELECT CAST('2021-06-06 23:38:46' AS timestamp) AS this_time

to_iso8601() timestamp 반환 값 변경

오류 메시지: 없음

원인: Athena 엔진 버전 2에서는 to_iso8601 함수에 전달된 값에 시간대가 없어도 해당 함수는 시간대가 포함된 타임스탬프를 반환합니다. Athena 엔진 버전 3에서 to_iso8601 함수는 전달된 인수에 시간대가 포함된 경우에만 시간대가 포함된 타임스탬프를 반환합니다.

예를 들어 다음 쿼리는 현재 날짜를 to_iso8601 함수에 두 번 전달합니다. 처음에는 시간대가 있는 타임스탬프로, 그 다음에는 타임스탬프로 전달합니다.

SELECT TO_ISO8601(CAST(CURRENT_DATE AS TIMESTAMP WITH TIME ZONE)), TO_ISO8601(CAST(CURRENT_DATE AS TIMESTAMP))

다음 출력은 각 엔진에서 쿼리 결과를 보여줍니다.

Athena 엔진 버전 2:

# _col0 _col1
1

2023-02-24T00:00:00.000Z

2023-02-24T00:00:00.000Z

Athena 엔진 버전 3:

# _col0 _col1
1

2023-02-24T00:00:00.000Z

2023-02-24T00:00:00.000

권장 솔루션: 이전 동작을 복제하려면 다음 예제와 같이 to_iso8601에 전달하기 전에 with_timezone 함수에 타임스탬프 값을 전달할 수 있습니다.

SELECT to_iso8601(with_timezone(TIMESTAMP '2023-01-01 00:00:00.000', 'UTC'))

Result

# _col0
1 2023-01-01T00:00:00.000Z

at_timezone() 첫 번째 파라미터에서 날짜를 지정해야 함

문제: Athena 엔진 버전 3에서 at_timezone 함수는 time_with_timezone 값을 첫 번째 파라미터로 사용할 수 없습니다.

원인: 날짜 정보가 없으면 전달된 값이 일광 절약 시간인지, 표준 시간인지 확인할 수 없습니다. 예를 들어 전달된 값이 태평양 일광 절약 시간(PDT)인지, 태평양 표준시(PST)인지 확인할 방법이 없으므로 at_timezone('12:00:00 UTC', 'America/Los_Angeles')은 모호합니다.

제한 사항

Athena 엔진 버전 3에는 다음과 같은 제한 사항이 있습니다.

  • 쿼리 성능 – 많은 쿼리가 Athena 엔진 버전 3에서 더 빠르게 실행되지만, 일부 쿼리 계획은 Athena 엔진 버전 2와 다를 수 있습니다. 따라서 일부 쿼리는 대기 시간 또는 비용이 다를 수 있습니다.

  • Trino 및 Presto 커넥터Trino 또는 Presto 커넥터는 지원되지 않습니다. Amazon Athena 연합 쿼리를 사용하여 데이터 소스를 연결합니다. 자세한 내용은 Amazon Athena 연합 쿼리 사용 단원을 참조하십시오.

  • 내결함성 실행 – Trino 내결함성 실행(Trino Tardigrade)은 지원되지 않습니다.

  • 함수 파라미터 한도 - 함수는 127개를 초과하는 파라미터를 사용할 수 없습니다. 자세한 내용은 함수 호출에 사용하는 인수가 너무 많음 단원을 참조하십시오.

리소스 제한으로 인해 쿼리가 실패하지 않도록 Athena 엔진 버전 2에서는 다음의 제한이 도입되었습니다. 이러한 제한은 사용자가 구성할 수 없습니다.

  • 결과 요소 수 - min(col, n), max(col, n), min_by(col1, col2, n), max_by(col1, col2, n) 함수의 경우 결과 요소 수 n이 10,000개 이하로 제한됩니다.

  • 그룹화 세트 - 그룹화 집합의 최대 슬라이스 수는 2048개입니다.

  • 최대 텍스트 파일 줄 길이 - 텍스트 파일의 기본 최대 줄 길이는 200MB입니다.

  • 시퀀스 함수 최대 결과 크기 - 시퀀스 함수의 최대 결과 크기는 50,000개의 항목입니다. 예를 들어, SELECT sequence(0,45000,1)은 성공하지만 SELECT sequence(0,55000,1)은 오류 메시지와 함께 실패합니다. 시퀀스 함수의 결과는 50,000개 항목 이하여야 합니다. 이 제한은 타임스탬프를 포함해 시퀀스 함수의 모든 입력 형식에 적용됩니다.