티스토리 뷰
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)
'데이터처리 > Hive' 카테고리의 다른 글
[HIVE] brickhouse UDF 사용예제 - timeseries (1) | 2024.01.19 |
---|---|
[HIVE] JSON 을 다루는 함수 설명 & 예시 - brickhouse UDF (0) | 2024.01.18 |
[HIVE] 타입별 test 용 데이터 표현 방법 - map/struct/array (0) | 2023.12.12 |
[HIVE] external table 이름 변경 후 location 까지 변경하는 방법 - 파티션 포함 (0) | 2023.12.01 |
[HIVE] Array 필드를 행으로 풀어내는 방법 - explode, posexplode (1) | 2023.11.27 |