sql—在配置单元中聚合每周数据

bq3bfh9z  于 2021-06-03  发布在  Hadoop
关注(0)|答案(1)|浏览(383)

我想根据下面查询中指定的条件,在过去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'
tez616oj

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

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

其中myquery是表示上面所表达的业务逻辑的视图。

相关问题