티스토리 뷰

반응형

hive 쿼리를 다루다보면 array, map 같은 데이터 타입이 존재하는데, 이런 데이터를 다룰때 기본적으로는 explode() 후 처리하는것이 기본적인 접근방식이다. 

 

1. hive 기본 array 함수

별도의 jar 를 추가할 필요없이 hive 에서 기본으로 제공하는 array 관련 함수이며, 관련된 내용은 아래 링크에 정리되어있다.

https://cwiki.apache.org/confluence/display/hive/languagemanual+udf

 

1.1 size 

배열의 사이즈를 구하는 함수이다.

beeline> select size( array(1,2,2,3) );
+------+
| _c0  |
+------+
| 4    |
+------+

 

1.2 array_contains

배열에 특정한 아이템이 존재하는지 여부를 판단한다.

beeline> select array_contains( array(1,2,3,3,4) , 1);
+-------+
|  _c0  |
+-------+
| true  |
+-------+
1 row selected (0.083 seconds)

beeline> select array_contains( array(1,2,3,3,4) , 6);
+--------+
|  _c0   |
+--------+
| false  |
+--------+
1 row selected (0.079 seconds)

 

1.3 sort_array

배열을 정리한다, 작은값이 맨 앞의 아이템으로 오도록 하며, 중복은 제거되지 않는다.

beeline> select sort_array( array(1,2,4, 3,3,5));
+----------------+
|      _c0       |
+----------------+
| [1,2,3,3,4,5]  |
+----------------+
1 row selected (0.086 seconds)

 


2. brickhouse 의 array 관련 함수 모음

brickhouse 라는 UDF 를 쓰면 더 많은일을 쉽게 처리할 수 있다. 심지어 누군가 만들어 놔서 쉽게 사용이 가능하다. 사용방법은 빌드한 jar 를 hdfs 에 업로드하고 ADD JAR 후 해당 Function 을 등록해서 사용할 수 있다.

 

단, brickhouse 의 UDF 패키지내에서 function 은 수동으로 등록해서 사용해야한다. 이 리스트는 아래 hql 을 참고하면 된다.

https://github.com/klout/brickhouse/blob/master/src/main/resources/brickhouse.hql

-- JAR 를 ADD 해주고, 필요한 함수는 FUNCTION 을 만들어서 사용해야한다.
beeline> ADD JAR hdfs:///tmp/addata/brickhouse-0.7.1-SNAPSHOT.jar;
beeline> CREATE TEMPORARY FUNCTION intersect_array AS 'brickhouse.udf.collect.ArrayIntersectUDF';

2.1. append_array

테스트해보면 오류가 발생된다.

beeline> CREATE TEMPORARY FUNCTION append_array AS 'brickhouse.udf.collect.AppendArrayUDF';
beeline> select append_array(array(1,2,3), 0);
Error: Error while compiling statement: FAILED: ClassCastException [Ljava.lang.Object; cannot be cast to java.util.List (state=42000,code=40000)

2.2. array_index

array 에서 특정 index 의 값을 리턴받는다. 근데 이건 별도의 UDF 없이 배열인덱스를 찾을수 있어서 뭐에 쓰는건지 모르겠다.

beeline> CREATE TEMPORARY FUNCTION array_index AS 'brickhouse.udf.collect.ArrayIndexUDF';
beeline> select array_index( array('a', 'b') , 0 );
+------+
| _c0  |
+------+
| a    |
+------+
1 row selected (0.078 seconds)

-- hive 기본 표현으로도 됨
beeline> select array('a','b')[0];
+------+
| _c0  |
+------+
| a    |
+------+
1 row selected (0.076 seconds)

2.3. array_union

array 를 합쳐서 하나의 array 로 만들어 낸다. 이때 중복 데이터는 제거된다.

beeline> CREATE TEMPORARY FUNCTION array_union AS 'brickhouse.udf.collect.ArrayUnionUDF';
beeline> select array_union ( array(1,2,3,4), array(3,4,1,1) );
+------------+
|    _c0     |
+------------+
| [1,2,3,4]  |
+------------+
1 row selected (0.081 seconds)

2.4. first_index

배열의 첫번째 인덱스값을 리턴한다. 사실 이건 [0] 형태를 사용하면 된다.

beeline> CREATE TEMPORARY FUNCTION first_index AS 'brickhouse.udf.collect.FirstIndexUDF';
beeline> select first_index( array(3,1,2) );
+------+
| _c0  |
+------+
| 3    |
+------+

-- hive 기본쿼리로도 가능하다.
beeline> select array(3,1,2)[0];
+------+
| _c0  |
+------+
| 3    |
+------+

 

2.5. last_index

배열의 마지막 아이템을 리턴한다. 사실 size() 함수를 이용해서 배열길이를 유도하고 -1 을 해서 해당아이템을 찾을수 있긴한데, 있으면 편하다.

beeline> CREATE TEMPORARY FUNCTION last_index AS 'brickhouse.udf.collect.LastIndexUDF';
beeline> select last_index( array(3,1,2) );
+------+
| _c0  |
+------+
| 2    |
+------+
1 row selected (0.075 seconds)

2.6. intersect_array

array 에서 교집합을 찾아내는 함수이다. 이때 중복 데이터는 제거된다.

beeline> CREATE TEMPORARY FUNCTION intersect_array AS 'brickhouse.udf.collect.ArrayIntersectUDF';
beeline> select intersect_array( array(1,2,3,4), array(3,4,1,1) );
+----------+
|   _c0    |
+----------+
| [1,3,4]  |
+----------+
1 row selected (0.074 seconds)

2.7. array_flatten

array 를 풀어내서 해당 아이템을 array 로 만들어주는것으로 보이는데, 오류가 발생된다.

beeline> CREATE TEMPORARY FUNCTION array_flatten AS 'brickhouse.udf.collect.ArrayFlattenUDF';
beeline> select array_flatten( array(array(1,2)), array(3,4) );
Error: Error while compiling statement: FAILED: ClassCastException org.apache.hadoop.hive.serde2.objectinspector.StandardConstantListObjectInspector cannot be cast to org.apache.hadoop.hive.serde2.objectinspector.PrimitiveObjectInspector (state=42000,code=40000)

 

반응형
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
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
글 보관함