2014-01-07 8 views
0

Я хотел агрегировать подсчет счетов в соответствии с критериями, указанными в запросе ниже, еженедельно за последние 3 месяца. Каков наиболее эффективный способ получить эти данные в таблице с num_of_accounts и неделями в качестве столбцов.агрегирование еженедельных данных в улье

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

Вы пытаетесь сделать счет уникальным для большого набора. Одним из подходов, который является масштабируемым, является использование вероятностной структуры данных, такой как набор гиперлогов или наборов эскизов КМВ, как и в Кирпичном доме (http://github.com/klout/brickhouse). Существует запись в блоге, описывающая ситуацию так же, как ваша, по адресу http://brickhouseconfessions.wordpress.com/2013/12/11/using-sketch_set-for-reach-estimation/. Это должно дать вам достаточно близкую оценку, без необходимости полностью использовать ваши данные.

Если вы правильно поняли, вы просто хотите, чтобы агрегировать по неделям, где у вас есть Hive UDF WEEKOFYEAR, который возвращает неделю из строки даты. Просто используйте sketch_set UDAF из Brickhouse

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

где myquery представляет собой вид, представляющий бизнес-логику, вы высказанное выше.

Смежные вопросы