티스토리 뷰
brickhouse 는 cookbook 이 정리가 잘 안되어있어서 좋은데도 사용을 잘 못하고 있는게 아닌가 싶다.
이번에는 timeseries 에 있는 함수의 예제를 정리하고자 한다.
https://github.com/klout/brickhouse/tree/master/src/main/java/brickhouse/udf/timeseries
1. moving_avg
이동평균값을 구할때 사용한다. 쉽게 생각하면 주식차트에서 7일 이동평균, 30일 이동평균선 같이 평균값을 만들어 내는데 이런 값을 유도한다고 생각하면 된다. 그래서 array 값과 이동평균을 할 값을 지정하면 된다. 내부적으로 double 로 캐스팅해서 계산하므로 항상 소숫점으로 나온다.
beeline> CREATE TEMPORARY FUNCTION moving_avg AS 'brickhouse.udf.timeseries.MovingAvgUDF';
beeline> select moving_avg(array(1,2,3,4,5,6,7,8,9,10), 2);
+--------------------------------------------+
| _c0 |
+--------------------------------------------+
| [1.0,1.5,2.5,3.5,4.5,5.5,6.5,7.5,8.5,9.5] |
+--------------------------------------------+
beeline> select moving_avg(array(1,2,3,4,5,6,7,8,9,10), 3);
+--------------------------------------------+
| _c0 |
+--------------------------------------------+
| [1.0,1.5,2.0,3.0,4.0,5.0,6.0,7.0,8.0,9.0] |
+--------------------------------------------+
1 row selected (0.084 seconds)
예를 들어, 1~10까지 3일 이동평균선을 만든다고 하면 다음과 같은 값으로 유도될수 있다.
즉, array 의 숫자의 평균을 계산할때 윈도우 사이즈를 3으로 잡고 옮기면서 평균을 구한다고 생각하면 된다.
3일 이동평균 | 이동평균값 | 비고 |
1 | 1 / 1 = 1 | 최초값의 이전값이 없으므로 자기자신 |
1 2 | (1+2) / 2 = 1.5 | 이전값이 1개뿐이라 2개의 평균 계산 |
1 2 3 | (1+2+3) / 3 = 2 | |
2 3 4 | (2+3+4) / 3 = 3 | |
3 4 5 | (3+4+5) / 3 = 4 | |
4 5 6 | (4+5+6) / 3 = 5 | |
5 6 7 | (5+6+7) / 3 = 6 | |
6 7 8 | (6+7+8) / 3 = 7 | |
7 8 9 | (7+8+9) / 3 = 8 | |
8 9 10 | (8+9+10) / 3 = 9 |
2. sum_array
array 에 있는 숫자값을 sum 한다. 이때 내부적으로 double 타입으로 합계를 구한다.
beeline> CREATE TEMPORARY FUNCTION sum_array AS 'brickhouse.udf.timeseries.SumArrayUDF';
beeline> select sum_array( array(1,2,3,5) );
+-------+
| _c0 |
+-------+
| 11.0 |
+-------+
1 row selected (0.077 seconds)
3. vector_add (오류?!)
array 혹은 map 타입의 합을 구한다. 희안한건 map 타입에서 정수형 타입은 합계가 구해지는데, array 표현이나, map 타입에서 소수형 표현은 값이 유도되지 않는다. 버그이거나 내가 사용법을 잘못 알고 있거나 둘중 하나인거 같다.
beeline> CREATE TEMPORARY FUNCTION vector_add AS 'brickhouse.udf.timeseries.VectorAddUDF';
-- MAP TYPE
-- {"key": 1, "value": 4} + {"key": 4, "value": 3}
beeline> select vector_add( map('key', 1, 'value', 4), map('key',4, 'value' , 3) );
+----------------------+
| _c0 |
+----------------------+
| {"key":5,"value":7} |
+----------------------+
1 row selected (0.083 seconds)
-- (???) 소숫점은 합계가 이상하게 null 로 리턴된다
beeline> select vector_add( map('key', 1, 'value', 4.1), map('key',4, 'value' , 3.2) );
+----------------------------+
| _c0 |
+----------------------------+
| {"key":null,"value":null} |
+----------------------------+
1 row selected (0.084 seconds)
-- ARRAY TYPE : ????
beeline> select vector_add( array(1,2) , array(3,4) );
Error: Error while compiling statement: FAILED: IndexOutOfBoundsException Index: 0, Size: 0 (state=42000,code=40000)
4. vector_scalar_mult (오류?!)
array 혹은 map 형태의 값에 곱하기를 해주는 합수로 보인다. map 의 경우 해당값이 리턴되는데 array 의 경우 IndexOutOfBounds 오류가 발생된다.
beeline> CREATE TEMPORARY FUNCTION vector_scalar_mult AS 'brickhouse.udf.timeseries.VectorMultUDF';
beeline> select vector_scalar_mult( map('key', 1, 'value', 4), 2 );
+----------------------+
| _c0 |
+----------------------+
| {"key":2,"value":8} |
+----------------------+
1 row selected (0.084 seconds)
beeline> select vector_scalar_mult( array(1, 2), 2 );
Error: Error while compiling statement: FAILED: IndexOutOfBoundsException Index: 0, Size: 0 (state=42000,code=40000)
5. vector_cross_product (오류?!)
vector_scalar_mult 가 map, array 에 N x 1 형태의 곱을 구한다면, vector_cross_product 는 N x M 의 곱을 구하는 함수이다.
그런데, array 타입은 역시 오류가 발생하는데 사용을 잘못거나 버그인것 같다.
beeline> CREATE TEMPORARY FUNCTION vector_cross_product AS 'brickhouse.udf.timeseries.VectorCrossProductUDF';
-- MAP 타입
beeline> select vector_cross_product (map('key', 1, 'value', 4), map('key', 2, 'value', 3));
+-----------------------+
| _c0 |
+-----------------------+
| {"key":2,"value":12} |
+-----------------------+
-- ARRAY 타입
beeline> select vector_cross_product (array(1,2), array(3,4));
Error: Error while compiling statement: FAILED: IndexOutOfBoundsException Index: 0, Size: 0 (state=42000,code=40000)
6. vector_dot_product
map 혹은 array 의 동일 index 혹은 key 의 값을 곱하고, 나머지를 더하는 형태의 계산을 유도한다.
즉, 스칼라곱을 구하는 공식으로 보인다. https://ko.wikipedia.org/wiki/%EC%8A%A4%EC%B9%BC%EB%9D%BC%EA%B3%B1
beeline> CREATE TEMPORARY FUNCTION vector_dot_product AS 'brickhouse.udf.timeseries.VectorDotProductUDF';
-- MAP TYPE
-- key (1 x 2) + value (4 x 3) = 2 + 12 = 14
beeline> select vector_dot_product (map('key', 1, 'value', 4), map('key', 2, 'value', 3));
+-------+
| _c0 |
+-------+
| 14.0 |
+-------+
1 row selected (0.083 seconds)
-- ARAY TYPE
-- (1 x 3) + (2 x 4) = 3 + 8 = 11
beeline> select vector_dot_product (array(1,2) , array(3,4));
+-------+
| _c0 |
+-------+
| 11.0 |
+-------+
7. vector_magnitude
벡터의 크기를 구하는 함수라고 하는데, 숫자들을 제곱한 값을 더한후 루트값을 유도하는걸로 보인다.
https://mathinsight.org/definition/magnitude_vector
예를 들어, 1,2,3 이라면 1의 제곱, 2의 제곱, 3의 제곱을 더하면 1+4+9 = 14가 되고, 14의 루트를 구하면 3.7416573867739413 이런 값을 만들수 있는데, 이 UDF 가 이런값을 유도한다.
beeline> CREATE TEMPORARY FUNCTION vector_magnitude AS 'brickhouse.udf.timeseries.VectorMagnitudeUDF';
-- MAP TYPE
beeline> select vector_magnitude (map('key' , 1, 'value', 2, 'asdf', 3) , 0);
+---------------------+
| _c0 |
+---------------------+
| 3.7416573867739413 |
+---------------------+
1 row selected (0.079 seconds)
-- ARRAY TYPE
beeline> select vector_magnitude (array(1,2,3), 0);
+---------------------+
| _c0 |
+---------------------+
| 3.7416573867739413 |
+---------------------+
1 row selected (0.08 seconds)
8. union_vector_sum (오류?!)
단일 ROW 에서 값을 유도하는게 아니라, 전체 ROW 의 vector 를 SUM 하는 쿼리이다.
즉, reducer 를 거쳐서 값이 나오는 구조이므로, 결과물은 1건이 리턴된다. 그런데 이녀석도 array 타입에서 오류가 나는데 내가 사용법을 잘못알고 있는건지 아님 버그가 있는건지 모르겠다.
beeline> CREATE TEMPORARY FUNCTION union_vector_sum AS 'brickhouse.udf.timeseries.VectorUnionSumUDAF';
-- MAP TYPE
beeline> select union_vector_sum( f ) FROM (
SELECT map('k', 1, 'v', 2) as f
UNION ALL
SELECT map('k', 3, 'v', 4) as f
) t;
+--------------------+
| _c0 |
+--------------------+
| {"v":6.0,"k":4.0} |
+--------------------+
1 row selected (6.425 seconds)
-- ARRAY TYPE
beeline> select union_vector_sum( f ) FROM (
SELECT array(2,3,4) as f
UNION ALL
SELECT array(1,2,3) as f
) t;
Caused by: java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
...
'데이터처리 > Hive' 카테고리의 다른 글
[HIVE] hive 4.x 에 있는 array udf 추출버전 jar - hive 3.x 버전에서 활용하기 (0) | 2024.01.29 |
---|---|
[HIVE] hive 4.x 버전에 추가된 array 함수 8개 : 예제 포함 (0) | 2024.01.26 |
[HIVE] JSON 을 다루는 함수 설명 & 예시 - brickhouse UDF (0) | 2024.01.18 |
[HIVE] Array 를 다루는 함수 정리 (UDF) - 기본 + brickhouse (0) | 2023.12.29 |
[HIVE] 타입별 test 용 데이터 표현 방법 - map/struct/array (0) | 2023.12.12 |