Athena 테이블을 쿼리할 때 레코드가 0개로 나오는 이유는 무엇입니까?
Amazon Athena에서 예상 열과 해당 데이터 유형을 사용하여 CREATE TABLE 문을 실행했습니다. 그런데 SELECT * FROM table-name 쿼리를 실행하면 "Zero records returned"라는 출력이 표시됩니다.
해결 방법
참고: AWS Command Line Interface(AWS CLI) 명령을 실행할 때 오류가 발생하면 AWS CLI의 오류 해결을 참조하십시오. 또한 최신 AWS CLI 버전을 사용하고 있는지 확인하십시오.
SELECT * FROM table-name 쿼리가 0개의 레코드를 반환하는 데에는 몇 가지 이유가 있습니다. 사용 사례에 따라 관련 섹션에서 일반적인 이유와 문제 해결 단계를 참조하십시오.
AWS Glue 파티션 문제 해결
크롤러 설정 확인하기
크롤러를 사용하는 경우 크롤러가 특정 파일이 아닌 Amazon Simple Storage Service(S3) 버킷을 가리키는지 확인하십시오. 예를 들어 s3://amzn-s3-demo-bucket/new/data.json 대신 s3://amzn-s3-demo-bucket/new를 사용하십시오.
올바른 LOCATION 경로 사용
입력 데이터의 Amazon S3 LOCATION 경로가 올바른지 확인합니다. 또한 S3 버킷 경로에 파일 또는 와일드카드가 포함되어 있지 않은지 확인하십시오. 예를 들어 s3://amzn-s3-demo-bucket/new/data.json 대신 s3://amzn-s3-demo-bucket/new LOCATION을 사용하십시오.
LOCATION 경로에 단일 슬래시 사용
Athena에서는 이중 슬래시(//)가 포함된 테이블 위치 경로를 사용할 수 없습니다. 예를 들어, **s3://amzn-s3-demo-bucket/myprefix//input//**이라는 LOCATION 경로는 빈 결과를 반환합니다.
이중 슬래시가 없는 위치에 파일을 복사하려면 다음 cp AWS CLI 명령을 실행합니다.
aws s3 cp s3://amzn-s3-demo-bucket/myprefix//input// s3://amzn-s3-demo-bucket/myprefix/input/ --recursive
참고: **amzn-s3-demo-bucket/myprefix//input//**를 현재 테이블 위치 경로로 바꾸고 **amzn-s3-demo-bucket/myprefix/input/**를 새 테이블 위치 경로로 바꾸십시오.
테이블의 열 이름에는 밑줄이나 대문자만 포함하는 것이 좋습니다. 예를 들어 열 이름은 table_name으로 지정할 수 있지만 table-name으로 지정할 수는 없습니다.
참고: AWS Glue와 Athena는 카멜 대소문자, 대문자 또는 밑줄 이외의 특수 문자를 읽을 수 없습니다.
각 테이블에 대한 Amazon S3 접두사 생성
AWS Glue 크롤러는 동일한 Amazon S3 접두사에 저장되는 데이터에 대해 별도의 테이블을 생성합니다. 하지만 Athena에서 해당 테이블을 쿼리하면 레코드가 0개입니다. 예를 들어 테이블 위치가 다음 예와 비슷한 경우 Athena 쿼리는 0개의 레코드를 반환합니다.
- s3://amzn-s3-demo-bucket/table1.csv
- s3://amzn-s3-demo-bucket/table2.csv
이 문제를 해결하려면 다음 예와 마찬가지로 각 테이블에 대해 개별 Amazon S3 접두사를 생성합니다.
- s3://amzn-s3-demo-bucket/table1/table1.csv
- s3://amzn-s3-demo-bucket/table2/table2.csv
그리고 다음 쿼리를 실행하여 테이블 위치를 업데이트합니다.
ALTER TABLE table1 SET LOCATION 's3://amzn-s3-demo-bucket/table1';
참고: amzn-s3-demo-bucket을 버킷 이름으로 바꾸고 table1을 테이블 이름으로 바꾸십시오.
파티션 로드
Athena는 사용자가 테이블을 생성할 때만 메타데이터를 생성합니다. 데이터는 사용자가 쿼리를 실행할 때만 구문 분석됩니다. 테이블에 정의된 파티션이 있는 경우 AWS Glue Data Catalog 또는 내부 Athena 데이터 카탈로그가 파티션을 로드하지 않았을 수 있습니다.
Athena가 파티션 형식을 지원하는 경우 MSCK REPAIR TABLE을 실행하여 파티션의 메타데이터를 카탈로그에 로드하십시오. 예를 들어 Year 기준으로 파티션된 테이블이 있습니다. 이 경우 Athena는 Amazon S3 경로에서 다음 예와 비슷한 데이터를 찾을 것으로 예상합니다.
- s3://amzn-s3-demo-bucket/athena/inputdata/year=2020/data.csv
- s3://amzn-s3-demo-bucket/athena/inputdata/year=2019/data.csv
- s3://amzn-s3-demo-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://amzn-s3-demo-bucket/athena/inputdata/';
Athena가 테이블을 생성한 후 다음 명령을 실행하여 파티션 정보를 로드합니다.
MSCK REPAIR TABLE Employee;
Athena가 데이터를 로드한 후 다음 쿼리를 다시 실행합니다.
SELECT * FROM Employee;
Athena가 파티션 형식을 지원하지 않거나 파티션이 다른 Amazon S3 경로에 있는 경우 각 파티션에 대해 ALTER TABLE ADD PARTITION을 실행합니다.
예를 들어, 데이터가 다음과 같은 예시 Amazon S3 경로에 있습니다.
- s3://amzn-s3-demo-bucket/athena/inputdata/2020/data.csv
- s3://amzn-s3-demo-bucket/athena/inputdata/2019/data.csv
- s3://amzn-s3-demo-bucket/athena/inputdata/2018/data.csv
위 경로에 대해 다음 예와 비슷한 명령을 실행합니다.
ALTER TABLE Employee ADD PARTITION (year=2020) LOCATION 's3://amzn-s3-demo-bucket/athena/inputdata/2020/' PARTITION (year=2019) LOCATION 's3://amzn-s3-demo-bucket/athena/inputdata/2019/' PARTITION (year=2018) LOCATION 's3://amzn-s3-demo-bucket/athena/inputdata/2018/'
Athena가 데이터를 로드한 후 다음 쿼리를 다시 실행합니다.
SELECT * FROM Employee;
파일 이름 확인
파일 이름이 밑줄 또는 마침표로 시작하지 않는지 확인하십시오.
사용자가 쿼리를 처리할 때 Athena는 이러한 파일을 자리 표시자로 간주하고 이를 무시합니다. Amazon S3 경로의 모든 파일 이름이 밑줄이나 마침표로 시작하는 경우 레코드가 0개가 됩니다.
예를 들어 Amazon S3 경로에 있는 다음 파일로 쿼리를 처리하면 레코드가 0개가 됩니다.
- s3://amzn-s3-demo-bucket/athena/inputdata/_file1
- s3://amzn-s3-demo-bucket/athena/inputdata/.file2
참고: Amazon S3 경로에 서로 다른 문자로 시작하는 파일과 자리 표시자가 포함된 경우 Athena는 자리 표시자만 무시하고 다른 파일을 쿼리합니다. 따라서 하나 이상의 레코드를 얻을 수 있습니다.
파티션 프로젝션 문제 해결
값이 범위 한계 내에 있는지 확인
값이 파티션 프로젝션에 정의된 범위 한계를 벗어나는 경우 쿼리는 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개의 레코드가 반환됩니다.
올바른 사용자 지정 스토리지 템플릿 사용
사용자 지정 템플릿을 사용하는 경우 Athena가 파티션 위치를 만들 수 있도록 템플릿을 사용해야 합니다. 또한 각 자리 표시자와 Amazon S3 경로가 슬래시 하나로 끝나는지 확인하십시오.
예를 들어 PARTITIONED BY(year 문자열) 데이터 정의 언어(DDL) 문을 사용하여 year 파티션 열을 정의하고 스토리지 위치가 **s3://amzn-s3-demo-bucket/athena/inputdata/Year=2022/**인 경우 이 위치는 0개의 레코드를 반환합니다. 이 문제를 해결하려면 스토리지 위치를 **s3://amzn-s3-demo-bucket/athena/inputdata/Year=${year}**로 업데이트하십시오.
파티션 속성 확인
enum, integer, date 또는 injected 유형의 파티션 열이 있는 경우 파티션 속성을 올바르게 구성해야 합니다. 구성을 통해 Athena는 Amazon S3의 데이터 구조와 일치하는 파티션 위치를 구축할 수 있어야 합니다.
예를 들어 매일 자정 이후 1시간이 경과하면 s3://amzn-s3-demo-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://amzn-s3-demo-bucket/athena/inputdata/2022-01-01-00-00에 해당하기 때문입니다.
이 문제를 해결하려면 projection.dt.range 속성을 2022-01-01-01-00,NOW로 설정합니다.

