고객님의 ETL 작업이 실패하는 이유는, 최신 파티션에 도입된 컬럼 필드가 이전 Parquet 파티션에는 물리적으로 존재하지 않기 때문입니다. 기본적으로 Spark는 스키마 추론(schema inference) 시 성능 최적화를 위해 일부 파일의 푸터(footer)만 샘플링하여 읽습니다. 이로 인해 새롭게 추가된 필드가 누락된 과거 데이터를 처리할 때 작업 충돌(crash)이 발생하게 됩니다.
이를 해결하려면 스키마 병합(schema merging) 기능을 활성화하여 Spark가 이러한 차이를 강제로 조정하도록 해야 합니다. 파일 경로를 지정하기 전, Spark 읽기(read) 구문에 .option("mergeSchema", "true")를 직접 추가함으로써 특정 DataFrame에 대해 동적으로 이 설정을 적용할 수 있습니다. 이 명령은 엔진이 모든 하위 Parquet 파일의 메타데이터 푸터를 읽어 전체(global) 스키마를 구성하도록 강제하며, 이전 파티션에서 누락된 컬럼에는 자동으로 null 값을 채워 넣습니다.
이 동작을 전체 작업에 걸쳐 전역적으로 활성화하려면, SparkSession 내에서 spark.sql.parquet.mergeSchema 속성을 true로 설정하여 클러스터 수준에서 적용할 수도 있습니다. 두 방법 중 어느 것을 선택하든, 데이터 변환을 실행하기 전에 Spark가 모든 개별 파일의 푸터를 읽어야 하는 오버헤드가 발생하므로 ETL 작업의 초기화 시간이 약간 증가할 수 있음을 염두에 두셔야 합니다.
이 답변이 유용한 정보가 되었기를 바랍니다. 도움이 되셨다면 "답변 채택(accept answer)"을 눌러주세요. 추가 질문이 있으시면 언제든지 댓글을 남겨주시기 바랍니다.
VPHAN