티스토리 뷰

반응형

보통 Unique Count 를 구하기위해서 다음과 같은 쿼리를 많이 사용한다. 

유니크 카운트가 필요한 대표적인 사례가  방문한 사람이 몇명인지 카운팅하는 User Count 를 구할때이다.

단순한 count 가 아니라, 중복 방문을 제거후 카운팅을 해야하다보니 비용이 비싼 쿼리이다.

SELECT count(distinct user_id) FROM logs WHERE ymd = '2022-01-02';

1개의 리듀서로 처리된다?

count(distinct ...) 형태로 쿼리를 날리면, "mapred.reduce.tasks=100" 같이 리듀서 갯수를 강제로 키워도 1개의 리듀서로 처리된다. 즉, 병렬처리가 안되기 때문에  매우 큰 데이터에서 이런 쿼리를 돌리게 되면?? 결과 보기가 하늘의 별따기가 된다.

 

인터넷에 보면 그래서 HIVE 에서 unique count 를 만들때 다음과 같이 만들라고 주로 가이드를 한다.

SELECT count(*) FROM (SELECT distinct user_id FROM logs WHERE ymd = '2022-01-02') a;

하지만, 이것도 데이터가 엄~~청 많으면 정말 오래걸린다. 예를 들어, 하루가 아니라 1년치 방문자수를 구해야한다면 어떻게 해야할까?

 

근사치로 빠르게 UC 구하기

사실 UC 를 구하는건 대부분 추세를 보기위한 용도가 크다. 얼마나 다양한 사용자가 꾸준히 사용하는지 보는 그런지표다.

그래서 약간의 정확성을 포기하더라도 distinct count 를 빠르게 구하는 방법이 존재한다. 근사치를 구하는 방식은 설명없이 링크로 대체하겠다. 

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

 

hive 에서는 기본으로 제공되는 함수는 아니지만 구현체가 존재한다. 

이런 형태로 데이터를 유도하면 사실상 O(1) 형태로 데이터 접근을 하기 때문에 성능에 유리하다.

https://hivemall.incubator.apache.org/userguide/misc/approx.html

ADD JAR hdfs:///hive-jar/hivemall-all-0.x.x-incubating-SNAPSHOT.jar;
CREATE TEMPORARY FUNCTION approx_count_distinct as 'hivemall.sketch.hll.ApproxCountDistinctUDAF';
 
SELECT
    approx_count_distinct(user_id, '-p 25') as uc
FROM
    logs
WHERE
    ymd >= '2021-01-01' and ymd <= '2021-12-31'
;

사실 presto 에는 이런 함수가 기본으로 제공되고 있기 때문에, hive 에도 이런 함수가 기본으로 제공되면 좋을것 같다.

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