2014-01-07 5 views
0

지난 3 개월 동안 주간 단위로 아래 쿼리에 지정된 기준에 따라 계정 수를 집계하고 싶습니다. num_of_accounts 및 weeks를 열로 사용하여 테이블에서이 데이터를 가져 오는 가장 효율적인 방법은 무엇입니까?주간 데이터를 하이브에 집계

select COUNT(DISTINCT a.account_id) as num_accounts, 
WEEKOFYEAR(a.ds) as week 
FROM 
    (SELECT 
    CAST(account_id as BIGINT) 
    FROM 
    tableA 
    WHERE ds='2013-12-28') a 
JOIN 
    tableB b 
ON a.account_id=b.account_id AND 
    b.ds='2013-12-28' 
WHERE 
b.invoice_date between '2013-12-22' AND '2013-12-28' AND 
b.payment_status = 'failed' AND b.payment_status = 'unbilled' 

답변

1

큰 세트에 대해 고유 한 카운트를 시도하고 있습니다. 확장 가능한 한 가지 방법은 Brickhouse (http://github.com/klout/brickhouse)에서 제공되는 것과 같은 hyperloglog 또는 KMV 스케치 세트와 같은 확률적인 데이터 구조를 사용하는 것입니다. http://brickhouseconfessions.wordpress.com/2013/12/11/using-sketch_set-for-reach-estimation/에 나와있는 것과 같은 상황을 설명하는 블로그 글이 있습니다. 이렇게하면 데이터를 완전히 사용하지 않고도 상당히 가까운 예상치를 얻을 수 있습니다.

정확하게 이해한다면 일주일에 날짜 문자열에서 1 주일을 반환하는 하이브 UDF WEEKOFYEAR이있는 주 단위로 집계하면됩니다. 그냥 MYQUERY는 위에서 표현 된 비즈니스 로직을 나타내는 도면이다 Brickhouse

SELECT WEEKOFYEAR(ds), estimated_reach(sketch_set(account_id)) as num_account_est 
    FROM myquery 
GROUP BY WEEKOFYEAR(ds); 

에서 sketch_set UDAF를 사용합니다.

관련 문제