티스토리 뷰

반응형

hive 4.x 버전에서 유용한 함수들이 많이 추가되었다. 그중 유용한 함수가 있어 몇가지 소개하고자 한다.

UniqueCount , Count Distinct 를 구할때 속도가 많이 느린 문제가 있다. 

 

PageCount 같은 경우는 단순히 count 하면 되지만, UserCount 를 할때는 중복 접속한 사람을 제거해야하는 문제인데, 문제는 이런 값을 구하는 속도가 너무 오래걸린다. 그래서 HyperHyperLog 알고리즘을 이용하여 빠르게 구하는 함수가 존재하는데, presto 에는 존재했는데 hive 에는 없어서 이 값을 구하려면 매우 오래걸렸다. (참고로 approx_distinct 는 근사치를 구하긴 하지만 정확도대비 성능을 보면 무조건 써야할 경우가 많다)

 

https://github.com/apache/hive/blob/branch-4.0/ql/src/java/org/apache/hadoop/hive/ql/exec/FunctionRegistry.java#L570

 

-- select count(distinct 필드명) from xxx; 를 대체 
select approx_distinct(필드명) from xxx;

 

실제 테스트

실제 성능이 얼마나 나오는지 테스트를 해본 결과 이다.

대상 데이터는 23억건 수준의 데이터였고, 이를 검색어로 uc 해본 결과를 찾아보았다.

 

count(distinct) 방식

count distinct 를 사용하면 리듀서가 2개가 동작했고, 총 시간도 39초가 걸렸다.

beeline> select count (distinct keyword) as sch_kwd_uc from t_keyword_table where ymd = '2024-06-22';
----------------------------------------------------------------------------------------------
        VERTICES      MODE        STATUS  TOTAL  COMPLETED  RUNNING  PENDING  FAILED  KILLED  
----------------------------------------------------------------------------------------------
Map 1 .......... container     SUCCEEDED   1218       1218        0        0       0       0  
Reducer 2 ...... container     SUCCEEDED    253        253        0        0       0       0  
Reducer 3 ...... container     SUCCEEDED      1          1        0        0       0       0  
----------------------------------------------------------------------------------------------
VERTICES: 03/03  [==========================>>] 100%  ELAPSED TIME: 39.00 s    
----------------------------------------------------------------------------------------------

+-------------+
| sch_kwd_uc  |
+-------------+
| 81331895    |
+-------------+
1 row selected (46.939 seconds)

 

approx_distinct 방식

우선 reducer 의 갯수가 확 줄어듬을 확인할 수 있다.

그리고 더 놀라운 사실은 구하는 필드의 갯수가 여러개라도 문제없이 동작한다는 사실이다.

 

성능은 좋아지지만 물론 단점은 정확한 데이터가 아닌 확률적 자료구조를 이용한 근사치이기 때문에 추세를 볼땐 괜찮지만 정확한 값을 구해야하는 상황이라면 오차가 있음은 인지를 해야한다.

 

https://d2.naver.com/helloworld/711301

 

관련된 내용이 궁금하면 위 글을 참고해보도록 하자.

beeline>  select  approx_distinct(keyword) as sch_kwd_uc from t_keyword_table where ymd = '2024-06-22';
----------------------------------------------------------------------------------------------
        VERTICES      MODE        STATUS  TOTAL  COMPLETED  RUNNING  PENDING  FAILED  KILLED  
----------------------------------------------------------------------------------------------
Map 1 .......... container     SUCCEEDED   1218       1218        0        0       0       0  
Reducer 2 ...... container     SUCCEEDED      1          1        0        0       0       0  
----------------------------------------------------------------------------------------------
VERTICES: 02/02  [==========================>>] 100%  ELAPSED TIME: 27.51 s    
----------------------------------------------------------------------------------------------

+-------------+
| sch_kwd_uc  |
+-------------+
| 81942335    |
+-------------+
1 row selected (27.774 seconds)
반응형
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
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
글 보관함