구글 빅쿼리 사용시 count(distinct)의 값이 정확하지 않은 문제
조대협 (http://bcho.tistory.com)
빅쿼리에서 count(distinct) 문을 사용하면, 종종 값이 부 정확하게 나오는 경우가 있다.
예를 들어서 아래의 두 쿼리는 같은 결과가 나와야 하는데, 아래 count(distinct id)를 쓴 쿼리는 다른 값을 리턴한다.
select count(*)
where id="mykey"
from mytable
select count(distinct id)
where id="mykey"
from mytable
빅쿼리에는 쿼리가 빅쿼리에 최적화된 SQL과 유사한 Legacy SQL 쿼리가 있고, ANSI SQL을 따르는 스탠다드 쿼리가 있다.
Legacy SQL 쿼리의 경우 확인해보니, 동작 방식이 다소 상이한 부분이 있다.
COUNT([DISTINCT] field [, n])
- Returns the total number of non-NULL values in the scope of the function.
If you use the
DISTINCT
keyword, the function returns the number of distinct values for the specified field. Note that the returned value forDISTINCT
is a statistical approximation and is not guaranteed to be exact.
Count(distinct) 함수의 경우 리턴 값이 1000이 넘을 경우에는 성능 향상을 위해서 정확한 값을 리턴하지 않고, 근사치 값 (approximation)을 리턴하도록 되어 있습니다. 그래서 상이한 결과가 나온다.
count(distinct platformadid,10000) 으로 하게 되면 리턴값이 10000을 넘을 경우에만 근사치 값을 리턴하게 됩니다. 즉 리턴값이 10000 이하이면 정확한 값을 리턴한다.
만약에 Legacy SQL에서 근사치 값이 아닌 정확한 값을 리턴 받으려면 count(distinct)
EXACT_COUNT_DISTINCT(field)
- Returns the exact number of non-NULL, distinct values for the specified field. For better scalability and performance, use COUNT(DISTINCT field).
함수를 사용하시는 방법이 있고, 아니면 Legacy SQL 의 특성에 의한 오류를 방지하시려면 쿼리를 ANSI SQL 모드로 실행하시면 됩니다.
ANSI SQL 모드로 수행하는 방법은 아래와 같이 "Use Legacy SQL" Box를 unchecking 하시고, 테이블 이름을 []로 감싸지 마시고 ``로 감싸서 사용하시면 된다.
'클라우드 컴퓨팅 & NoSQL > google cloud' 카테고리의 다른 글
구글 클라우드의 서버리스 서비스 Cloud Functions (1) | 2017.03.20 |
---|---|
한시간에 만드는 대용량 로그수집 분석 시스템 (1) | 2017.01.24 |
Docker Kubernetes의 UI (0) | 2016.11.26 |
파이어베이스를 이용한 유니티 게임 로그 분석 (2) | 2016.11.15 |
파이어베이스 애널러틱스를 이용한 모바일 데이타 분석- #4 주피터 노트북을 이용한 파이어베이스 데이타 분석 및 시각화 (1) | 2016.09.06 |