日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2024/8/23 编程问答 48 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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

原文鏈接

本文為阿里云原創內容,未經允許不得轉載。

總結

以上是生活随笔為你收集整理的Hologres如何支持超高基数UV计算(基于roaringbitmap实现)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 国产传媒视频在线 | 青娱网电信一区电信二区电信三区 | 久久午夜夜伦鲁鲁片 | 国产综合婷婷 | 亚洲美女自拍视频 | 亚洲午夜精品一区二区 | a∨视频| 国产精品视频亚洲 | 亚洲图片一区二区三区 | 中国av一区二区 | 日本一品道 | 久久精品激情 | 无遮挡在线观看 | 99色视频 | 麻豆精品自拍 | 免费黄色国产 | 欧美一级片网址 | 在线观看亚洲av每日更新 | 免费看成人啪啪 | 天天摸夜夜 | 会喷水的亲姐姐 | 日韩国产小视频 | 久久精品噜噜噜成人88aⅴ | 久久国产视频精品 | 91 在线视频 | 黄色免费在线观看网站 | 2018国产精品 | 夜夜小视频 | 欧美精品自拍偷拍 | 国产一区免费看 | 99精品一区二区三区无码吞精 | 视频在线观看99 | 玩弄丰满少妇xxxxx性多毛 | 成人在线天堂 | 黄色片aaaa | 97超碰人人 | 91免费视频网| 美女脱衣服一干二净 | 久久久久久久久免费看无码 | 国产精品亚洲色图 | 日韩精品一区二区三区高清免费 | 中文字幕乱码免费 | 男女扒开双腿猛进入爽爽免费 | 欧美日韩视频网站 | 午夜爽爽视频 | 91久久一区二区 | av在线手机观看 | 打美女屁股网站 | 欧美日韩精品一二三区 | 国产成人精品999在线观看 | 邻居少妇张开腿让我爽了在线观看 | 欧美日韩激情一区二区 | 射进来av影视网 | 国产精品久久久久久久久久免费看 | 日本精品一区二区三区视频 | 成人激情在线 | 国产女主播喷水视频在线观看 | 亚洲国产综合视频 | 五月婷婷在线播放 | 少妇99| 探花精品 | av第一页 | 女人脱裤子让男人捅 | 在线精品国产 | 成人在线观看黄色 | 黄色一级视频片 | 国产高清一级片 | 国产乱淫av麻豆国产 | www午夜 | 在线视频福利 | 国产美女在线观看 | 51成人精品网站 | 操穴网站| 亚洲综合网在线 | 久草婷婷 | 中文字幕日韩精品亚洲一区小树林 | 国产又色又爽又黄又免费 | 国产婷婷色一区二区三区在线 | 国产av人人夜夜澡人人爽麻豆 | 学生孕妇videosex性欧美 | 色超碰| 国产一级内谢 | www 在线观看视频 | 怎么可能高潮了就结束漫画 | 久久爱伊人 | 精品少妇3p | 欧美日韩一区二区综合 | 午夜电影福利网 | 国产精品日韩电影 | 女人看黄色网 | 日韩视频在线免费 | 黄大片18满岁 | 亚洲4区 | 成人一级免费视频 | 日韩在线资源 | 日韩在线小视频 | 日本电影一区 | 神马午夜麻豆 | 美女黄色小视频 |