파서를 안쓰고 하둡에서 바로 데이터 처리할때,
LATERAL VIEW explode 와 LATERAL VIEW posexplode기능은 매우 유용하다.
예를 들어, 다음과 같은 데이터를 풀고 싶은 경우가 있다.
■ 원본
name |
objects |
홍길동 |
카메라,라면,고기 |
둘리 |
소고기,노트북 |
■ 바꾸고 싶은 결과
name |
object |
objects |
홍길동 |
카메라 |
카메라,라면,고기 |
홍길동 |
라면 |
카메라,라면,고기 |
홍길동 |
고기 |
카메라,라면,고기 |
둘리 |
소고기 |
소고기,노트북 |
둘리 |
노트북 |
소고기,노트북 |
해결방법
1. LATERAL VIEW explode 사용하기
이런식으로 푸는게 가능하다. 하지만, objects 의 순서(index) 가 알고 싶으면 어떻게 할까?
첫번째 아이템만 알고 싶을경우...
hive> select
name,
object,
objects
from (
select '홍길동' as name, '카메라,라면,고기' as objects
UNION ALL
select '홍길동' as name, '소고기,노트북' as objects
) log
LATERAL VIEW explode(split(objects, ",")) `_objects` AS object
OK
name object objects
홍길동 카메라 카메라,라면,고기
홍길동 라면 카메라,라면,고기
홍길동 고기 카메라,라면,고기
홍길동 소고기 소고기,노트북
홍길동 노트북 소고기,노트북
Time taken: 13.055 seconds, Fetched: 5 row(s)
2. LATERAL VIEW posexplode 사용하기
구분자로 쪼갠 인덱스까지 알고 싶다면 posexplode 를 쓰면 된다.
사용법은 거의 같다.
hive> select
name,
idx,
object,
objects
from (
select '홍길동' as name, '카메라,라면,고기' as objects
UNION ALL
select '홍길동' as name, '소고기,노트북' as objects
) log
LATERAL VIEW posexplode(split(objects, ",")) `_objects` AS object, idx
OK
name idx object objects
홍길동 카메라 0 카메라,라면,고기
홍길동 라면 1 카메라,라면,고기
홍길동 고기 2 카메라,라면,고기
홍길동 소고기 0 소고기,노트북
홍길동 노트북 1 소고기,노트북