티스토리 뷰

반응형

hive 에서는 Array 형태의 데이터를 풀어서 ROW 로 풀어내는게 가능하다. 이때 사용하는문법이 explode 이다.

posexplode 는 무엇이냐? 인덱스번호까지 알아야할 경우가 종종 있는데 이때는 posexplode 를 쓰면 된다.

 

이해를 돕기위해 아래와 같은 데이터가 존재한다고 가정하자. (v_sample)

beeline> select * from v_sample;
+------------------+-------------------------+
|  v_sample.tags   |     v_sample.title      |
+------------------+-------------------------+
| ["fun","happy"]  | hello! my name is haha  |
| []               | test                    |
+------------------+-------------------------+
2 rows selected (0.098 seconds)

 

explode 사용 예시

tags 를 row 풀어서 보고 싶다고 가정하면 아래와 같이 표현하면 된다. 

단, explode 만 사용하면 emtpry array 나 NULL 은 생략되는데, 이 데이터도 같이 봐야한다면? outer explode 를 쓰면 된다.

-- explode 만 쓰면 null, empty array 는 제거된다
beeline> SELECT
  tag,
  title
FROM
  v_sample
LATERAL VIEW explode(tags) items as tag;

+--------+-------------------------+
|  tag   |          title          |
+--------+-------------------------+
| fun    | hello! my name is haha  |
| happy  | hello! my name is haha  |
+--------+-------------------------+
2 rows selected (4.125 seconds)

 

즉, 아래와 같이 LATERAL VIEW outer explode 를 쓰면 된다.

주의할건 split() 을 이용하여 처리하여 array 를 만들어 낼때, split("", ",") 와 같은 결과값은 빈 배열이 아니라, [""] 배열이 리턴되므로 Array 타입이 아닌 문자열을 split 해서 사용할때는 주의가 필요하다.

-- empty array, null 도 풀어내려면 "outer explode" 를 써야한다.

beeline> SELECT
   tag,
   title
 FROM
   v_sample
 LATERAL VIEW outer explode(tags) items as tag
 ;


+--------+-------------------------+
|  tag   |          title          |
+--------+-------------------------+
| fun    | hello! my name is haha  |
| happy  | hello! my name is haha  |
| NULL   | test                    |
+--------+-------------------------+
3 rows selected (4.29 seconds)

 

posexplode

가끔 데이터를 풀고, 그게 배열의 몇번째 아이템인지 알아야 하는 경우가 가끔 있다.

예를 들어, 배열이 너무 커서 대표값으로 3개만 써야한다거나? 대표값으로 하나만 사용해야한다거나와 같이 응용이 필요한 경우가 있다. 이런경우는 explode 가 아닌 posexplode 를 사용하면 된다.

 

beeline> SELECT
  idx,
  tag,
  title
FROM
  v_sample
LATERAL VIEW outer posexplode(tags) items as idx, tag
;

+--------+-------+-------------------------+
|  idx   |  tag  |          title          |
+--------+-------+-------------------------+
| fun    | 0     | hello! my name is haha  |
| happy  | 1     | hello! my name is haha  |
| NULL   | NULL  | test                    |
+--------+-------+-------------------------+
3 rows selected (4.358 seconds)

 

 

이녀석도 explode 와 동일하게 outer 여부에 따라 null, 빈배열을 풀어낼지 말지 선택가능하므로 필요에 따라 골라서 조합해 사용하자.

반응형
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
글 보관함