ARRAY를 UNNEST한 컬럼으로 ROW_NUMBER를 정렬하면 특정 구버전에서 NPE가 난다.
같은 query 안의 alias만 바꾸는 우회는 optimizer가 다시 결합할 수 있어 물리 staging을 사용했다. 이는 추가 조사한 우회이며 원본에서의 성공 확인은 없다.
배열 전개 결과를 scalar Parquet staging 테이블로 물리화한 뒤 window 함수를 적용해 문제 계획 경로를 우회한다.
확인 수준: 추가 조사 해법 · 해당 케이스 적용 결과 미확인
적용 조건: <...>와 예시 DB·테이블·경로·수치는 실제 확인값으로 바꾼다. 명령과 메뉴는 참고 문서를 바탕으로 보강한 예시이며 대상 시스템에서 실행하지 않았다. 버전·원인에 따른 분기와 남은 확인 사항은 아래에 명시한다.
CREATE TABLE db.flat_array_stage STORED AS PARQUET AS
SELECT e.event_id, e.group_id, a.pos AS item_pos, a.item AS item_value
FROM db.array_events e, e.items a;
SELECT event_id, item_value,
ROW_NUMBER() OVER (
PARTITION BY group_id ORDER BY item_value, event_id, item_pos
) AS rn
FROM db.flat_array_stage;
NPE가 없어지고 배열 전개 건수·값·window 순서가 기대 결과와 일치하는지 확인한다.