티스토리 뷰
보통 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 에도 이런 함수가 기본으로 제공되면 좋을것 같다.
'데이터처리 > Hive' 카테고리의 다른 글
[에러] beeline 에서 오류 원인 : Unexpected end of file when reading from HS2 server (0) | 2023.02.08 |
---|---|
[Hive] select * from table 에서 필드 일부만 제외하는 방법? - 블랙리스트 방식 (0) | 2022.10.25 |
[HIVE] Hive 의 skewed 문제 튜닝하기 (0) | 2022.06.06 |
[오류] hive 를 union all 할때 null 오류 문제 -tez엔진- (0) | 2021.11.23 |
[오류] hive llap 지원 버전 오류 - java.lang.OutOfMemoryError: Java heap space - 컨테이너모드 (0) | 2021.11.22 |