Amazon Athena 테이블을 쿼리할 때 반환되는 레코드가 없는 이유는 무엇인가요?

3분 분량
0

Amazon Athena에서 원하는 열과 데이터 유형으로 CREATE TABLE 문을 실행했습니다. SELECT* FROM table-name 쿼리를 실행하면 "0개의 레코드가 반환됩니다.(Zero records returned.)"가 출력됩니다.

해결 방법

다음은 쿼리가 빈 결과를 반환하는 몇 가지 일반적인 이유입니다.

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

크롤러를 사용하는 경우 크롤러가 파일 대신 Amazon S3(Amazon Simple Storage Service) 버킷을 가리켜야 합니다.

잘못된 LOCATION 경로

입력된 데이터의 Amazon S3 LOCATION 경로를 확인합니다. 입력 LOCATION 경로가 잘못된 경우 Athena는 빈 결과를 반환합니다.

LOCATION 경로의 이중 슬래시

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

s3://doc-example-bucket/myprefix//input//

이 문제를 해결하려면 파일을 이중 슬래시가 없는 위치에 복사합니다. 다음은 AWS 명령줄 인터페이스(AWS CLI) 명령 예제입니다.

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

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

같은 S3 접두사에 저장된 여러 테이블의 데이터

Glue 크롤러는 같은 S3 접두사에 저장된 데이터에 대해 별도의 테이블을 생성합니다. 그러나 Athena에서 해당 테이블을 쿼리하면 레코드가 0이 됩니다.

예를 들어, 테이블 위치가 다음과 유사한 경우 Athena 쿼리는 빈 결과를 반환합니다.

  • 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을 사용하여 파티션 정보를 카탈로그에 로드합니다.

MSCK REPAIR TABLE: 파티션이 Athena가 지원하는 형식으로 저장되었으면 MSCK REPAIR TABLE을 실행하여 파티션의 메타데이터를 카탈로그에 로드하세요. 예를 들어, 연도별로 파티션이 지정된 테이블이 있는 경우 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;

ALTER TABLE ADD PARTITION: 파티션이 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 숨은 파일

파일 이름이 밑줄 (_) 또는 마침표(.)로 시작하지 않도록 확인합니다.

예:

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

S3 경로의 파일에 밑줄이나 마침표로 시작하는 이름이 있으면 Athena는 이러한 파일을 자리 표시자로 간주합니다. Athena는 쿼리를 처리할 때 이러한 파일을 무시합니다. 자세한 내용은 Athena가 숨겨진 파일을 읽을 수 없습니다를 참조하세요. S3 경로의 모든 파일에 밑줄 또는 마침표로 시작하는 이름이 있으면 아무런 레코드가 반환되지 않습니다.

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


관련 정보

Athena에서 테이블 생성

AWS Glue 크롤러 사용

AWS 공식
AWS 공식업데이트됨 2년 전