
ASAC 2기 데이터 엔지니어링 실습으로 S3를 Data Lake로 삼고 AWS Athena를 연동하는 기본 파이프라인을 구축하던 중 오류가 발생했습니다.
data/basic 경로에 다중 JSON(dict 형태)이 나열된 a.txt 파일 업로드.dummy_test_tbl)을 생성.HIVE_BAD_DATA: Error reading field 'event_id' at position X. invalid magic number
이 에러는 S3에 적재된 실제 데이터의 포맷과 Athena(Glue Data Catalog)에 정의된 테이블 포맷 설정이 불일치할 때 발생합니다.
JSON입니다. 그러나 테이블 속성을 PARQUET로 지정하면, Athena의 쿼리 엔진은 파일을 읽을 때 파일의 맨 앞 4바이트에서 Parquet 포맷의 고유 식별자인 매직 넘버(PAR1)를 찾습니다.invalid magic number 파싱 에러를 뱉어내는 것입니다. Athena는 쿼리 엔진일 뿐, 테이블 포맷을 바꾼다고 S3 S3 원본 데이터를 변환해주지 않습니다.데이터의 수집(Raw)과 가공(Refined) 단계를 철저히 분리하여 접근해야 합니다.
Step 1: Raw 데이터 테이블은 원본 포맷과 100% 일치하게 재생성
Parquet가 아닌 원본 데이터와 동일한 JSON으로 정확히 지정하여 테이블을 다시 생성합니다. (내부적으로 OpenX JSON SerDe가 사용됩니다.)dummy_test_tbl_json)을 쿼리하면 정상적으로 S3의 JSON 텍스트를 읽어옵니다.Step 2: 분석을 위한 Parquet 테이블은 CTAS로 별도 생성 (ETL 처리)
-- JSON 테이블의 데이터를 읽어 Parquet 포맷으로 S3 새 경로에 저장하는 ETL 로직
CREATE TABLE dummy_test_tbl_parquet
WITH (
format = 'PARQUET',
external_location = 's3://your-bucket/data/refined/'
) AS
SELECT *
FROM dummy_test_tbl_json;

HIVE_BAD_DATA 장애로 이어집니다.