Amazon Athena 테이블을 쿼리할 때 레코드가 0개로 나오는 이유는 무엇인가요?

5분 분량
0

Amazon Athena에서 예상 열과 해당 데이터 유형을 사용하여 CREATE TABLE 문을 실행했습니다. SELECT * FROM table-name 쿼리를 실행하면 "Zero records returned."라고 출력됩니다.

해결 방법

쿼리에서 0개의 레코드가 반환하는 데에는 몇 가지 일반적인 이유가 있습니다. 사용 사례에 따라 관련 섹션에서 일반적인 이유와 문제 해결 단계를 참조하세요.

AWS Glue 파티션

크롤러 설정에서 선택한 파일

크롤러를 사용하는 경우 크롤러가 파일이 아닌 Amazon Simple Storage Service(S3) 버킷을 가리키는지 확인하세요.

잘못된 LOCATION 경로

입력 데이터의 Amazon S3 LOCATION 경로를 확인합니다. 입력 LOCATION 경로가 잘못된 경우, Athena는 0개의 레코드를 반환합니다.

LOCATION 경로의 이중 슬래시

Athena는 이중 슬래시(//)가 포함된 테이블 위치 경로를 지원하지 않습니다. 예를 들어, 다음 LOCATION 경로는 빈 결과(s3://doc-example-bucket/myprefix//input//)를 반환합니다.

이 문제를 해결하려면 이중 슬래시가 없는 위치에 파일을 복사하세요. 다음은 파일을 복사하는 AWS Command Line Interface(AWS CLI) 명령입니다.

aws s3 cp s3://doc-example-bucket/myprefix//input// s3://doc-example-bucket/myprefix/input/ --recursive

참고: AWS CLI 명령을 실행할 때 오류가 발생하는 경우 최신 버전의 AWS CLI 를 사용하고 있는지 확인하세요.

특수 문자

테이블의 열 이름에는 밑줄이나 대문자만 포함하는 것이 좋습니다. 예를 들어 열 이름은 table_name으로 지정할 수 있지만 table-name으로 지정할 수는 없습니다. 동일한 S3 접두사에 저장된 여러 테이블의 데이터 AWS Glue 크롤러는 동일한 S3 접두사에 저장된 데이터에 대해 별도의 테이블을 생성합니다. 하지만 Athena에서 해당 테이블을 쿼리하면 레코드가 0개입니다. 예를 들어 테이블 위치가 다음 예와 비슷한 경우 Athena 쿼리는 0개의 레코드를 반환합니다.

  • s3://doc-example-bucket/table1.csv
  • s3://doc-example-bucket/table2.csv

이 문제를 해결하려면 다음 예와 마찬가지로 각 테이블에 대해 개별 S3 접두사를 생성하세요.

  • s3://doc-example-bucket/table1/table1.csv
  • s3://doc-example-bucket/table2/table2.csv

그런 다음 이 예제와 비슷한 쿼리를 실행하여 table1 테이블의 위치를 업데이트합니다.

ALTER TABLE table1 SET LOCATION 's3://doc-example-bucket/table1';

아직 로드되지 않은 파티션

Athena는 테이블이 생성될 때만 메타데이터를 생성합니다. 데이터는 쿼리를 실행할 때만 파싱됩니다. 테이블에 정의된 파티션이 있는 경우, 파티션이 아직 AWS Glue 데이터 카탈로그 또는 내부 Athena 데이터 카탈로그에 로드되지 않았을 수 있습니다. MSCK REPAIR TABLE 또는 ALTER TABLE ADD PARTITION을 사용하여 카탈로그에 파티션 정보를 로드합니다.

파티션이 Athena에서 지원하는 형식으로 저장되어 있는 경우, MSCK REPAIR TABLE을 실행하여 파티션의 메타데이터를 카탈로그에 로드합니다. 예를 들어 Year를 기준으로 분할된 테이블이 있는 경우, Athena는 다음 예와 유사한 Amazon S3 경로에서 데이터를 찾을 것으로 예상합니다.

  • s3://doc-example-bucket/athena/inputdata/year=2020/data.csv
  • s3://doc-example-bucket/athena/inputdata/year=2019/data.csv
  • s3://doc-example-bucket/athena/inputdata/year=2018/data.csv

데이터가 Athena가 예상한 Amazon S3 경로에 있는 경우 다음 예제와 비슷한 명령을 실행하여 테이블을 복구하세요.

CREATE EXTERNAL TABLE Employee (
    Id INT,
    Name STRING,
    Address STRING
) PARTITIONED BY (year INT)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
LOCATION 's3://doc-example-bucket/athena/inputdata/';

테이블이 생성된 후 파티션 정보를 로드합니다.

MSCK REPAIR TABLE Employee;

데이터를 로드한 후 다음 쿼리를 다시 실행합니다.

SELECT * FROM Employee;

파티션이 Athena가 지원하는 형식으로 저장되지 않았거나 다른 Amazon S3 경로에 있는 경우, 각 파티션에 대해 ALTER TABLE ADD PARTITION을 실행합니다.

예를 들어, 데이터가 다음과 같은 예제 Amazon S3 경로에 있다고 가정해 보겠습니다.

  • s3://doc-example-bucket/athena/inputdata/2020/data.csv
  • s3://doc-example-bucket/athena/inputdata/2019/data.csv
  • s3://doc-example-bucket/athena/inputdata/2018/data.csv

이러한 경로를 사용하여 다음 예제와 비슷한 명령을 실행합니다.

ALTER TABLE Employee ADD
    PARTITION (year=2020) LOCATION 's3://doc-example-bucket/athena/inputdata/2020/'
    PARTITION (year=2019) LOCATION 's3://doc-example-bucket/athena/inputdata/2019/'
    PARTITION (year=2018) LOCATION 's3://doc-example-bucket/athena/inputdata/2018/'

데이터를 로드한 후 다음 쿼리를 다시 실행합니다.

SELECT * FROM Employee;

Hive 숨김 파일

파일 이름이 밑줄(_) 또는 마침표(.)로 시작하지 않는지 확인하세요.

Athena는 이러한 파일을 자리 표시자로 간주하고 사용자가 쿼리를 처리할 때 무시합니다. 자세한 내용을 보려면 Athena가 숨김 파일을 읽을 수 없습니다를 참조하세요. S3 경로의 모든 파일 이름이 밑줄이나 마침표로 시작하는 경우 레코드가 0개가 됩니다.

**참고:**S3 경로에 이름이 다른 문자로 시작하는 파일과 함께 자리 표시자가 포함된 경우, Athena는 자리 표시자만 무시하고 다른 파일을 쿼리합니다. 따라서 하나 이상의 레코드를 얻을 수 있습니다.

예를 들면 다음과 같습니다.

  • s3://doc-example-bucket/athena/inputdata/_file1
  • s3://doc-example-bucket/athena/inputdata/.file2

파티션 프로젝션

파티션 프로젝션의 범위 내에 있지 않은 값

파티션 프로젝션에 정의된 범위를 벗어나는 값에 대한 쿼리는 오류를 반환하지 않습니다. 대신 쿼리는 0개의 행을 반환합니다.

예를 들어, 데이터가 2020년에 시작되고 다음과 같이 정의되어 있다고 가정합니다. projection.timestamp.range'='2020/01/01,NOW

이 예제 쿼리를 실행하면 쿼리가 성공적으로 완료되지만 0개의 행이 반환됩니다.

SELECT * FROM table-name WHERE timestamp = '2019/02/02'

스토리지 템플릿이 기본 파티션 구성표를 따르지 않습니다

Amazon S3 파일 위치가 ".../column=value..." 위치 패턴을 따르지 않는 경우, 사용자 지정 Amazon S3 파티셔닝 체계를 지정해야 합니다. 사용자 지정 체계를 정의하지 않으면 쿼리에서 0개의 레코드가 반환됩니다.

사용자 지정 S3 파티셔닝 체계를 정의하려면 사용자 지정 S3 스토리지 위치 지정을 참조하세요.

잘못된 사용자 지정 스토리지 템플릿

사용자 지정 템플릿을 사용하는 경우 Athena가 파티션 위치를 만들 수 있도록 템플릿을 사용해야 합니다. 또한 각 자리 표시자와 Amazon S3 경로가 슬래시 하나로 끝나는지 확인하세요.

예를 들어 DDL 문 **PARTITIONED BY(연도 문자열)**를 사용하여 파티션 열 연도를 정의하고 S3 파일 위치가 **s3://doc-example-bucket/athena/inputdata/Year=2022/라고 가정해 보겠습니다.**이 위치는 0개의 레코드를 반환합니다. Amazon S3 스토리지 위치를 다음과 같이 업데이트합니다. s3://doc-example-bucket/athena/inputdata/Year=${year}.

파티션 속성

파티션 열이 열거형, 정수 또는 날짜 유형인 경우 파티션 속성을 올바르게 설정했는지 확인하세요. 구성을 통해 Athena는 Amazon S3의 데이터 구조와 일치하는 파티션 위치를 구축할 수 있어야 합니다.

예를 들어, 매일 자정 한 시간 후에 한 시간 단위로 들어오는 시간 관련 데이터가 s3://doc-example-bucket/athena/inputdata/2022-01-01-01-00 위치에 있다고 가정해 보겠습니다.

이 예제에서 Athena 테이블은 다음과 같은 파티션 속성을 사용합니다.

'projection.dt.format' = 'yyyy-MM-dd-HH-mm',
'projection.dt.range' = '2022-01-01-00-00,NOW',
'projection.dt.interval' = '1',
'projection.dt.interval.unit' = 'DAYS'

예제 테이블에서 실행되는 쿼리는 0개의 레코드를 반환합니다. 이는 예상되는 속성의 파일 위치가 자정 s3://doc-example-bucket/athena/inputdata/2022-01-01-00-00에 해당하기 때문입니다.

이 문제를 해결하려면 'projection.dt.range' 속성을 **'2022-01-01-01-00,NOW'**로 설정합니다.

관련 정보

Athena에서 테이블 생성

AWS Glue 크롤러 사용

파티션 프로젝션 설정

AWS 공식
AWS 공식업데이트됨 8달 전
댓글 없음