我想根据下面查询中指定的条件,在过去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条答案
按热度按时间tez616oj1#
你想在一个大集合上做一个唯一的计数。一种可扩展的方法是使用概率数据结构,如hyperloglog或kmv草图集,如brickhouse(http://github.com/klout/brickhouse ) . 有一篇博文描述了一个和你一样的情况http://brickhouseconfessions.wordpress.com/2013/12/11/using-sketch_set-for-reach-estimation/ . 这应该给你一个相当接近的估计,而不必完全依赖你的数据。
如果我没弄错的话,你只想按周累计,在那里你有一个Hive自定义项
WEEKOFYEAR
从日期字符串返回一周。就用这个sketch_set
砖厂udaf其中myquery是表示上面所表达的业务逻辑的视图。