我有一组结构如下的数据:
[uid, product, currency, platform, date]
[100, product_1, USA, desktop, 2019-01-01]
[100, product_2, USA, desktop, 2019-01-03]
[200, product_3, CAN, mobile, 2019-01-02]
[300, product_1, GBP, desktop, 2019-01-01]
and so on...
数据必须每年汇总:
[year, product, currency, platform, uid_count]
[2019, product_1, USA, desktop, 1000]
[2019, product_2, USA, desktop, 2000]
[2019, product_3, GBP, mobile, 5000]
在研究了一个解决方案之后,我读到了关于素描算法的文章,这似乎是正确的方向。基本上,数据太大,无法在一个批中加载,因此我需要以增量方式(例如每天)处理它,这样我就不会运行如下sql查询:
SELECT year(date), product, currency, platform, count(distinct uid) FROM tbl_name GROUP BY 1, 2, 3, 4
或
SELECT year(date), product, currency, platform, count(distinct uid) FROM tbl_name GROUP BY 1, 2, 3, 4
with cube
1条答案
按热度按时间x6h2sr281#
不幸的是,
count(distinct uid)
不是可加性的,并且您需要重新迭代全年数据集,您不能计算一天的不同天数并将其添加到现有的累计年份计数不同天数中。因为如果相同的UID存在于不同的时代count(distinct uid)
第一天+count(distinct uid)
第二天不等于count(distinct uid)
按这两天算。这使得count(distinct)不可伸缩。但是,如果估计是适用的,也许你可以基于草图算法做一些近似估计。
对于hive,很少有现成的草图算法实现。
这个hyperloglog用于hive:hllhiveudfssketches库,来自yahoo
砖瓦厂素描自定义项-“k-最小值”素描算法。
还有一个实现:https://github.com/mlnick/hive-udf/wiki