Hive에서 발생하는 'Only SubQuery expressions that are top level conjuncts are allowed' 오류 해결

문제 상황

CDH 5.15.1 환경의 Hue 콘솔에서 Hive를 사용하여 복잡한 SQL을 실행할 때, IN 절 내부에 서브쿼리가 포함되어 있고, 그 조건이 OR와 함께 사용된 경우, 다음과 같은 오류가 발생합니다:

Only SubQuery expressions that are top level conjuncts are allowed

이 문제는 서브쿼리가 최상위 조건(즉, 논리식의 직접적인 구성 요소)이 아닌, 복합 조건 내부에 포함되어 있을 때 발생합니다. 예시로 아래와 같은 SQL이 있습니다:

SELECT a.a1, a.a2, COUNT(*) AS num
FROM test1 a
WHERE a.a3 IN ('1', '2')
  AND (
    a.a4 IN ('2', '3')
    OR
    a.a4 NOT IN (
      SELECT c1 FROM test2 c WHERE c2 = '1'
    )
  )
GROUP BY a.a1, a.a2;

환경 정보

소프트웨어버전
CDH5.15.1
Hive1.1.0

오류 원인

Hive는 IN (SELECT ...) 형태의 서브쿼리를 허용하지만, 이 서브쿼리가 전체 WHERE 절의 최상위 논리 조건(컨정트, conjunct)이어야 합니다. 위 예시에서 a.a4 NOT IN (SELECT ...)OR 조건의 일부로 중첩되어 있어, 최상위 조건이 아니므로 해석 시 오류가 발생합니다.

반면, 다음은 유효한 구조입니다:

SELECT a.a1, a.a2, COUNT(*) AS num
FROM test1 a
WHERE a.a3 IN ('1', '2')
  AND a.a4 NOT IN (
    SELECT c1 FROM test2 c WHERE c2 = '1'
  )
GROUP BY a.a1, a.a2;

해결 방법

이 문제는 서브쿼리가 최상위 조건이 되도록 재구성하면 해결됩니다. 두 가지 대안적 접근법을 제시합니다.

1. UNION ALL로 조건 분리

OR 조건을 두 개의 독립적인 쿼리로 나누고, 결과를 결합합니다. 중복 데이터가 발생할 수 있으므로 DISTINCT 또는 UNION를 활용하세요.

SELECT a.a1, a.a2, COUNT(*) AS num
FROM test1 a
WHERE a.a3 IN ('1', '2') AND a.a4 IN ('2', '3')
GROUP BY a.a1, a.a2

UNION ALL

SELECT a.a1, a.a2, COUNT(*) AS num
FROM test1 a
WHERE a.a3 IN ('1', '2')
  AND a.a4 NOT IN (
    SELECT c1 FROM test2 c WHERE c2 = '1'
  )
GROUP BY a.a1, a.a2;

2. LEFT JOIN을 통한 조건 재구성

서브쿼리 결과를 외부 조인으로 처리하고, 매칭되지 않은 레코드(NULL)를 조건으로 활용합니다. 이 방식은 원본 구조를 거의 유지하면서도 문제를 회피할 수 있습니다.

SELECT a.a1, a.a2, COUNT(*) AS num
FROM test1 a
LEFT JOIN (
  SELECT c1 FROM test2 c WHERE c2 = '1'
) c ON a.a4 = c.c1
WHERE a.a3 IN ('1', '2')
  AND (
    a.a4 IN ('2', '3')
    OR c.c1 IS NULL
  )
GROUP BY a.a1, a.a2;

이 방법은 NOT IN의 동작을 LEFT JOIN + IS NULL로 대체함으로써, 서브쿼리가 최상위 조건이 되지 않아도 되도록 설계되었습니다.

결과

변경 작업을 최소화하기 위해 두 번째 방법(외부 조인 기반)을 선택했으며, 성공적으로 쿼리가 정상 실행되었습니다.

결론

SQL 오류는 종종 문법적 제약보다는 해석 구조의 불일치에서 비롯됩니다. 문제의 핵심 원인을 파악하고, 가능한 대체 구조를 고려하면 효과적인 해결책을 도출할 수 있습니다. 이후에는 이러한 사례를 문서화하여 지속적인 지식 축적이 가능합니다.

태그: Hive SQL Subquery IN Clause OR Condition

6월 17일 20:13에 게시됨