Lateral View 활용
Lateral View 활용 (LanguageManual LateralView)
LATERAL VIEW는 explode() 같은 UDTF(사용자 정의 테이블 생성 함수)와 함께 쓰여, 입력 행마다 UDTF를 적용하고 그 출력 행을 원래 입력 행과 결합해 가상 테이블을 만들어주는 Hive의 기능이에요. 배열·중첩 데이터를 펼치거나, OUTER 키워드로 빈 결과도 행으로 살려낼 수 있답니다.
출처: 문서
본문
Lateral View 구문 (Syntax)
lateralView: LATERAL VIEW udtf(expression) tableAlias AS columnAlias (',' columnAlias)*
fromClause: FROM baseTable (lateralView)*
설명 (Description)
Lateral view는 explode() 같은 사용자 정의 테이블 생성 함수(UDTF)와 함께 사용돼요. Built-in Table-Generating Functions에서 언급했듯이 UDTF는 입력 행마다 0개 이상의 출력 행을 생성해요. lateral view는 먼저 기본 테이블의 각 행에 UDTF를 적용한 뒤, 그 결과 출력 행들을 입력 행과 조인해 지정된 테이블 별칭(table alias)을 갖는 가상 테이블을 만들어요.
버전 (Version)
Hive 0.6.0 이전에는 lateral view가 predicate push-down 최적화를 지원하지 않았어요. Hive 0.5.0 이하에서 WHERE 절을 사용하면 쿼리가 컴파일되지 않을 수 있었죠. 해결책으로 쿼리 전에 set hive.optimize.ppd=false;를 추가했어요. 이 문제는 Hive 0.6.0에서 수정됐어요. 참고: https://issues.apache.org/jira/browse/HIVE-1056 (Predicate push down does not work with UDTF's).
버전 (Version)
Hive 0.12.0부터 컬럼 별칭(column alias)을 생략할 수 있어요. 이 경우 별칭은 UDTF가 반환하는 StructObjectInspector의 필드 이름에서 상속돼요.
예제 (Example)
pageAds라는 기본 테이블을 생각해 봐요. 두 개의 컬럼이 있어요: pageid(페이지 이름)와 adid_list(페이지에 표시되는 광고의 배열):
| 컬럼 이름 | 컬럼 타입 |
|---|---|
| pageid | STRING |
| adid_list | Array |
두 행이 있는 예제 테이블:
| pageid | adid_list |
|---|---|
| front_page | [1, 2, 3] |
| contact_page | [3, 4, 5] |
사용자는 모든 페이지에 걸쳐 특정 광고가 나타난 총 횟수를 세고 싶어해요.
explode()를 사용한 lateral view로 adid_list를 각각의 행으로 변환할 수 있어요:
SELECT pageid, adid
FROM pageAds LATERAL VIEW explode(adid_list) adTable AS adid;
결과는 다음과 같아요:
| pageid (string) | adid (int) |
|---|---|
| "front_page" | 1 |
| "front_page" | 2 |
| "front_page" | 3 |
| "contact_page" | 3 |
| "contact_page" | 4 |
| "contact_page" | 5 |
특정 광고가 나타난 횟수를 세려면 count/group by를 사용할 수 있어요:
SELECT adid, count(1)
FROM pageAds LATERAL VIEW explode(adid_list) adTable AS adid
GROUP BY adid;
| int adid | count(1) |
| 1 | 1 |
| 2 | 1 |
| 3 | 2 |
| 4 | 1 |
| 5 | 1 |
여러 개의 Lateral View (Multiple Lateral Views)
FROM 절에는 여러 개의 LATERAL VIEW 절이 올 수 있어요. 이후의 LATERAL VIEW는 그 LATERAL VIEW 왼쪽에 나타나는 테이블의 어떤 컬럼이든 참조할 수 있어요.
예를 들어, 다음은 유효한 쿼리예요:
SELECT * FROM exampleTable
LATERAL VIEW explode(col1) myTable1 AS myCol1
LATERAL VIEW explode(myCol1) myTable2 AS myCol2;
LATERAL VIEW 절은 나타난 순서대로 적용돼요. 다음 기본 테이블로 예를 들어 보면:
| Array |
Array |
| [1, 2] | [a", "b", "c"] |
| [3, 4] | [d", "e", "f"] |
다음 쿼리:
SELECT myCol1, col2 FROM baseTable
LATERAL VIEW explode(col1) myTable1 AS myCol1;
결과:
| int mycol1 | Array |
| 1 | [a", "b", "c"] |
| 2 | [a", "b", "c"] |
| 3 | [d", "e", "f"] |
| 4 | [d", "e", "f"] |
LATERAL VIEW를 하나 더 추가하는 쿼리:
SELECT myCol1, myCol2 FROM baseTable
LATERAL VIEW explode(col1) myTable1 AS myCol1
LATERAL VIEW explode(col2) myTable2 AS myCol2;
결과:
| int myCol1 | string myCol2 |
| 1 | "a" |
| 1 | "b" |
| 1 | "c" |
| 2 | "a" |
| 2 | "b" |
| 2 | "c" |
| 3 | "d" |
| 3 | "e" |
| 3 | "f" |
| 4 | "d" |
| 4 | "e" |
| 4 | "f" |
Outer Lateral Views
버전 (Version)
Hive 0.12.0에서 도입됨
사용자는 선택적인 OUTER 키워드를 지정해, 보통은 LATERAL VIEW가 행을 생성하지 않을 때에도 행을 생성할 수 있어요. 이는 explode할 컬럼이 비어 있을 때 쉽게 발생하는데, 사용한 UDTF가 행을 생성하지 않는 경우예요. 이 경우 원본 행은 결과에 절대 나타나지 않아요. OUTER를 사용하면 이를 방지할 수 있고, UDTF에서 온 컬럼은 NULL 값으로 행이 생성돼요.
예를 들어, 다음 쿼리는 빈 결과를 반환해요:
SELEC * FROM src LATERAL VIEW explode(array()) C AS a limit 10;
하지만 OUTER 키워드를 쓰면:
SELECT * FROM src LATERAL VIEW OUTER explode(array()) C AS a limit 10;
이렇게 결과가 생성돼요:
238 val_238 NULL
86 val_86 NULL
311 val_311 NULL
27 val_27 NULL
165 val_165 NULL
409 val_409 NULL
255 val_255 NULL
278 val_278 NULL
98 val_98 NULL
…
더 알아보기 (Learn more)
- Hive UDTF 문서에서 explode를 포함한 테이블 생성 함수를 더 확인할 수 있어요.
- Hive 언어 매뉴얼에서 더 많은 SQL 기능을 배울 수 있어요.