Lateral View 활용

Lateral View 활용 (LanguageManual LateralView)

LATERAL VIEWexplode() 같은 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 col1 Array col2
[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 col2
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 기능을 배울 수 있어요.