Hologres如何支持超高基数UV计算(基于roaringbitmap实现)

简介: 本文将会介绍Hologres基于roaringbitmap实现超高基数的UV计算

RoaringBitmap是一种压缩位图索引,RoaringBitmap自身的数据压缩和去重特性十分适合对于大数据下uv计算。其主要原理如下:

  • 对于32bit数, RoaringBitmap会构造2^16个桶,对应32位数的高16位;32位数的低16位则映射到对应桶的一个bit上。单个桶的容量由桶中的已有的最大数值决定
  • bitmap把32位数用1位表示,可以大大地压缩数据大小。
  • bitmap位运算为去重提供了手段。

主体思想(T+1):把上一天的所有数据根据最大的查询维度聚合出的uid结果放入RoaringBitmap中,把RoaringBitmap和查询维度存放在聚合结果表(每天百万条)。之后查询时,利用Hologres强大的列存计算直接按照查询维度去查询聚合结果表,对其中关键的RoaringBitmap字段做or运算进行去重后并统计基数,即可得出对应用户数UV,count条数即可计算得出PV,达到亚秒级查询。

只需进行一次最细粒度的预聚合计算,也只生成一份最细粒度的预聚合结果表。得益于Hologres的实时计算能力,该方案下预计算所需的次数和空间都达到较低的开销。

Hologres计算UV、PV方案详情

 

图1 Hologres基于RoaringBitmap计算pv uv流程

 

1.创建相关基础表

1)使用RoaringBitmap前需要创建RoaringBitmap extention,语法如下,同时该功能需要Hologres  0.10版本。

CREATE EXTENSION IF NOT EXISTS roaringbitmap;

2)创建表ods_app为明细源表,存放用户每天大量的明细数据 (按天分区),其DDL如下:

BEGIN;
CREATE TABLE IF NOT EXISTS public.ods_app (uid text,country text,prov text,city text,channel text,operator text,brand text,ip text,click_time text,year text,month text,day text,ymd text NOT NULL
);
CALL set_table_property('public.ods_app', 'bitmap_columns', 'country,prov,city,channel,operator,brand,ip,click_time, year, month, day, ymd');
--distribution_key根据需求设置,根据该表的实时查询需求,从什么维度做分片能够取得较好效果即可
CALL set_table_property('public.ods_app', 'distribution_key', 'uid');
--用于做where过滤条件,包含完整年月日时间字段推荐设为clustering_key和event_time_column
CALL set_table_property('public.ods_app', 'clustering_key', 'ymd');
CALL set_table_property('public.ods_app', 'event_time_column', 'ymd');
CALL set_table_property('public.ods_app', 'orientation', 'column');
COMMIT;

3)创建表uid_mapping为uid映射表,uid映射表用于映射uid到32位int类型。

RoaringBitmap类型要求用户ID必须是32位int类型且越稠密越好(用户ID最好连续),而常见的业务系统或者埋点中的用户ID很多是字符串类型,因此使用uid_mapping类型构建一张映射表。映射表利用Hologres的SERIAL类型(自增的32位int)来实现用户映射的自动管理和稳定映射。

注: 该表在本例每天批量写入场景,可为行存表也可为列存表,没有太大区别。如需要做实时数据(例如和Flink联用),需要是行存表,以提高Flink维表实时JOIN的QPS。

BEGIN;CREATE TABLE public.uid_mapping (uid text NOT NULL,uid_int32 serial,PRIMARY KEY (uid) );--将uid设为clustering_key和distribution_key便于快速查找其对应的int32值
CALL set_table_property('public.uid_mapping', 'clustering_key', 'uid');
CALL set_table_property('public.uid_mapping', 'distribution_key', 'uid');
CALL set_table_property('public.uid_mapping', 'orientation', 'row');
COMMIT;

3)创建表dws_app基础聚合表,用于存放在基础维度上聚合后的结果

基础维度为之后进行查询计算pv和uv的最细维度,这里以country, prov, city为例构建聚合表

begin;
create table dws_app(country text,prov text,city text, ymd text NOT NULL,  --日期字段uid32_bitmap roaringbitmap, -- UV计算pv integer, -- PV计算primary key(country, prov, city, ymd)--查询维度和时间作为主键,防止重复插入数据
);
CALL set_table_property('public.dws_app', 'orientation', 'column');
--clustering_key和event_time_column设为日期字段,便于过滤
CALL set_table_property('public.dws_app', 'clustering_key', 'ymd');
CALL set_table_property('public.dws_app', 'event_time_column', 'ymd');
--distribution_key设为group by字段
CALL set_table_property('public.dws_app', 'distribution_key', 'country,prov,city');
end;

2.更新dws表及id_mapping表

每天从上一天的uid中找出新客户(uid映射表uid_mapping中没有的uid)插入到uid映射表中

WITH
-- 其中ymd = '20210329'表示上一天的数据user_ids AS ( SELECT uid FROM ods_app WHERE ymd = '20210329' GROUP BY uid ),new_ids AS ( SELECT user_ids.uid FROM user_ids LEFT JOIN uid_mapping ON (user_ids.uid = uid_mapping.uid) WHERE uid_mapping.uid IS NULL )
INSERT INTO uid_mapping SELECT  new_ids.uid
FROM    new_ids
;

更新完uid映射表后,将数据做聚合运算后插入聚合结果表,主要步骤如下:

  • 首先通过源表inner join uid映射表,得到上一天的聚合条件和对应的uid_int32;
  • 然后按照聚合条件做聚合运算后插入RoaringBitmap聚合结果表,作为上一天的聚合结果;
  • 每天只需进行一次聚合,存放一份数据,数据条数最坏等于UV的量。以案例说明,明细表每天几亿的增量,在聚合结果表每天只需存放百万级数据。
WITHaggregation_src AS( SELECT country, prov, city, uid_int32 FROM ods_app INNER JOIN uid_mapping ON ods_app.uid = uid_mapping.uid WHERE ods_app.ymd = '20210329' )
INSERT INTO dws_app SELECT  country,prov,city,'20210329',RB_BUILD_AGG(uid_int32),COUNT(1)
FROM    aggregation_src
GROUP BY country,prov,city
;

3.UV、PV查询

查询时,从汇总表dws_app 中按照查询维度做聚合计算,查询bitmap基数,得出Group by条件下的用户数

--运行下面RB_AGG运算查询,可先关闭三阶段聚合开关性能更佳(默认关闭)
set hg_experimental_enable_force_three_stage_agg=off    --可以查询基础维度任意组合,任意时间段的uv pv
SELECT  country,prov,city,RB_CARDINALITY(RB_OR_AGG(uid32_bitmap)) AS uv,sum(1) AS pv
FROM    dws_app
WHERE   ymd = '20210329'
GROUP BY country,prov,city;--查一个月         
SELECT  country,prov,RB_CARDINALITY(RB_OR_AGG(uid32_bitmap)) AS uv,sum(1) AS pv
FROM    dws_app
WHERE   ymd >= '20210301' and ymd <= '20210331'
GROUP BY country,prov;
该查询等价于
SELECT  country,prov,city,COUNT(DISTINCT uid) AS uv,COUNT(1) AS pv
FROM    ods_app
WHERE   ymd = '20210329'
GROUP BY country,prov,city;SELECT  country,prov,COUNT(DISTINCT uid) AS uv,COUNT(1) AS pv
FROM    ods_app
WHERE   ymd >= '20210301' and ymd <= '20210331'
GROUP BY country,prov;         

4.可视化展示

计算出UV、PV和,大多数情况需要用BI工具以更直观的方式可视化展示,由于需要使用RB_CARDINALITY 和 RB_OR_AGG 进行聚合计算,需要使用BI的自定义聚合函数的能力,常见的具备该能力的BI包括Apache Superset和Tableau,下面将会讲述这两个BI工具的最佳实践。

4.1 使用 Apache Superset

Apache Superset 对接 Hologres 的方式,请参考产品手册。在Superset中可以直接使用dws_app表作为Dataset使用

 

并且在数据集中,创建一个单独Metrics,名为UV,表达式如下:

RB_CARDINALITY(RB_OR_AGG(uid32_bitmap))

 

然后您就可以开始探索数据了

 

 

当然也可以创建Dashborad:

 

4.2 使用 Tableau

Tableau 对接 Hologres 的方式,请参考产品手册。可以使用Tableau的直通函数直接实现自定义函数的能力,详细介绍请参照Tableau的手册。在Tableau对接Hologres后,可以创建一个计算字段,表达式如下

RAWSQLAGG_INT("RB_CARDINALITY(RB_OR_AGG(%1))", [Uid32 Bitmap])

 

然后您就可以开始探索数据了

 

当然也可以创建Dashborad

image.png

原文链接

本文为阿里云原创内容,未经允许不得转载。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/513419.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

阿里云贾扬清:大数据+AI工程化,让数据从「成本」变为「资产」

简介&#xff1a; 近年来&#xff0c;数字经济发展迅速&#xff0c;企业转型背后频频涌现「数字力量」的身影。云计算、大数据、人工智能的快速融合形成了数字经济的新基建&#xff0c;也为数字经济发展带来了新的机遇。 5 月 20 日&#xff0c;阿里巴巴副总裁、阿里云计算平台…

easyexcel 日期类型 convert_数据库的几种日期时间类型,你真的会用吗?

日期和时间是每个系统&#xff0c;每个数据库设计必不可少的部分。也是容易被大家忽视的部分。很多开发者可能根本不了解以不同类型存储日期和时间意味着什么。有朋友可能会说&#xff0c;数据库定义一个datetime或timestamp类型的字段&#xff0c;然后在Java代码中获取当前时间…

从重复到重用

简介&#xff1a; 开发技术的发展&#xff0c;从第一次提出“函数/子程序”&#xff0c;实现代码级重用&#xff1b;到面向对象的“类”&#xff0c;重用数据结构与算法&#xff1b;再到“动态链接库”、“控件”等重用模块&#xff1b;到如今流行的云计算、微服务可重用整个系…

JAVA中randomfile_java中的RandomAccessFile的用法

Java的RandomAccessFile提供对文件的读写功能&#xff0c;与普通的输入输出流不一样的是RamdomAccessFile可以任意的访问文件的任何地方。这就是“Random”的意义所在。RandomAccessFile的对象包含一个记录指针&#xff0c;用于标识当前流的读写位置&#xff0c;这个位置可以向…

官宣|Apache Flink 1.13.0 正式发布,流处理应用更加简单高效!

简介&#xff1a; Flink 1.13.0 版本让流处理应用的使用像普通应用一样简单和自然&#xff0c;并且让用户可以更好地理解流作业的性能。 ​翻译 | 高赟 Review | 朱翥、马国维 Flink 1.13 发布了&#xff01;Flink 1.13 包括了超过 200 名贡献者所提交的 1000 多项修复和优化…

lightning接口_Lightning太赚钱?iPhone永远不会用Type-C

欧盟日前通过了法案&#xff0c;要求在欧洲销售的各手机制造商要统一充电接口&#xff0c;全部采用USB Type-C接口&#xff0c;但这可能让一直使用Lightning(闪电)充电接口的Apple受到很大影响。虽说目前苹果的Mac电脑、iPad平板电脑以及智能音箱等部分产品都开始使用USB Type-…

这个冬天,头秃了,口袋也空了......

秋天里的第一杯奶茶刚喝完&#xff0c;冬天里的第一条秋裤就要安排上&#xff01;不让加班的程序员&#xff0c;从此的生活便不只有脑袋秃秃&#xff0c;还有口袋空空&#xff01;从外包出来&#xff0c;没想到新的面试让我手忙脚乱外包虐我千百遍&#xff0c;只能待她如初恋&a…

云数据仓库的未来趋势:计算存储分离

简介&#xff1a; 随着云时代的到来&#xff0c;数据库也开始拥抱云数据库时代&#xff0c;各类数据库系统在各内外云平台百花齐放&#xff0c;有开源的MySQL、PostgreSQL、MongoDB&#xff0c;传统数据库厂商的SQLServer、Oracle&#xff0c;云厂商自研的Aurora、Redshift、Po…

Java内存配太大导致fullgc_记一次因为短命大对象导致fullGC的问题

写在前面java内存申请和释放均是由jvm在控制。而释放往往会出现各种各样的问题&#xff0c;经常一个引用没处理好就引起内存泄漏&#xff0c;最后引发OOM。如果发生在重要业务系统还可能出现严重的生产事故。 因此内存使用一定要谨慎&#xff0c;特别是引用要及时断链。虽然jvm…

异步编程到底在说啥?

作者 | 码农的荒岛求生来源 | 码农的荒岛求生之前很多同学在微信上问能不能讲讲异步编程是怎么一回事儿&#xff0c;今天就和大家简单聊一聊这个话题。我们以函数调用为例&#xff0c;假设有这样的代码&#xff1a;void B() {lines read(filename);sum(lines); }void A() {...…

如何让评审人爱上我

简介&#xff1a; 今天小编作为一个开发者&#xff0c;放下外部的客观因素&#xff0c;仅从一个代码的实现者&#xff0c;一个被评审人的角度去思考如何让评审变得高效而富有意义。换句话说&#xff1a;如何让评审人爱上我&#xff08;被评审人&#xff09;。 众所周知&#x…

centos8安装mysql_CentOS8+FreeRadius+Mysql8.0+daloRadius建立Radius服务器

Linux发行版&#xff1a;CentOS8-1905数据库&#xff1a;Mysql8.0create WEB软件&#xff1a;httpddaloRadius前端使用PHPyum -y install update yum -y install httpd //web服务器 yum -y install vim // yun -y install wget // yum -y install net-to…

2025年公有云或将服务中国过半数字经济

简介&#xff1a; 2025年公有云或将服务中国过半数字经济阿里云研究院 高级战略总监 麻芃2020年&#xff0c;疫情“黑天鹅”对全球经济社会运行造成剧烈冲击&#xff0c;但数字经济的引擎作用却逆势凸显。去年我国数字经济整体规模达到39.2万亿元&#xff0c;实现9.7%的高速增长…

php mysql 绕过_PHP中md5绕过

一、md5($password,true)的SQL注入问题这里要提到一下MySQL中的数值比较问题。1、当数字和字符串比较时&#xff0c;若字符串的数字部分(需要从头开始)和数字是相同的&#xff0c;那么则返回的是true。select if(1"1abcd","等于","不等于") as t…

重磅发布:微服务引擎 MSE 专业版

简介&#xff1a; 性能提升 10 倍&#xff0c;更高的 SLA 保障&#xff0c;新用户限时抢购 8 折资源包。 微服务引擎 MSE 专业版发布&#xff0c;支持 Nacos 2.0 &#xff0c;相比基础版&#xff0c;专业版具有更高的 SLA 保障&#xff0c;性能提升十倍&#xff0c;99.95%可用…

45分钟,411个中小品牌天猫双11实现新跨越

CSDN从天猫获悉&#xff0c;今年天猫双11&#xff0c;有一批中小品牌实现跨越式增长。截至11月11日0点45分&#xff0c;已有411个去年成交额过百万的中小品牌&#xff0c;今年销售额突破千万&#xff1b;更有40个去年双11成交额千万级的品牌&#xff0c;在今年双11成交额突破了…

组装台式电脑配置清单_攒机必备!各种价位的台式电脑配置清单!

点击上方「软件分享云」关注我们台式机&#xff0c;是一种独立相分离的计算机&#xff0c;完完全全跟其它部件无联系&#xff0c;相对于笔记本和上网本体积较大&#xff0c;主机、显示器等设备一般都是相对独立的&#xff0c;一般需要放置在电脑桌或者专门的工作台上。因此命名…

达摩院重要科技突破!空天数据库引擎Ganos解读

简介&#xff1a; Ganos空天数据库引擎是李飞飞带领的达摩院数据库与存储实验室研发的新一代位置智能引擎&#xff0c;采用了平台即服务、多模融合、计算下推和云原生全新处理架构&#xff0c;为政府、企事业单位、泛互联网客户提供移动对象、空间/时空、遥感多模态数据混合存储…

brainfuck 在线_酒店在线声誉持久战 重视社媒舆论 保持品牌一致性

维护品牌或酒店声誉是一场持久战&#xff0c;这对塑造积极的品牌认知和提升客户满意度至关重要。声誉管理包括两个关键部分&#xff1a;引导客人评价和公众舆论&#xff0c;并以适当的方式进行反馈。就在线声誉管理而言&#xff0c;品牌还需要注意另外一点&#xff0c;公众会在…

2021天猫双11:阿里巴巴业务已全部跑在阿里云上

“今年天猫双11是首个100%的云上双11&#xff0c;成功扛住了全球规模最大的流量洪峰。”11月11日&#xff0c;阿里巴巴首席技术官程立表示&#xff0c;阿里巴巴业务已全部跑在阿里云上&#xff0c;体验如丝般顺滑。经过历年双11的“大考”&#xff0c;阿里技术实现了多级跳跃。…