PostgreSQLHybridDBforPG毫秒級多維資料透視案例分享
標籤
PostgreSQL , 資料透視 , 實時 , 物化 , 預計算 , 多維分析 , 流計算 , 增量合併 , 排程 , HLL
背景
典型的電商類資料透視業務,透視的語料可能會包含一些使用者的標籤資料:例如包含品牌的ID,銷售區域的ID,品牌對應使用者的ID,以及若干使用者標籤欄位,時間欄位等。
標籤可能會按不同的維度進行歸類,例如tag1 性別,tag2 年齡段, tag3 興趣愛好, …。
業務方較多的需求可能是對自有品牌的使用者進行透視,統計不同的銷售區域(渠道)、時間段、標籤維度下的使用者數(一個非常典型的資料透視需求)。
例子
資料結構舉例
每天所在區域、銷售渠道的活躍使用者ID
t1 (
uid, -- 使用者ID
groupid, -- 銷售渠道、區域ID
day -- 日期
)
每個品牌的自有使用者,維護增量
t2 (
uid, -- 使用者ID
pinpai -- 品牌
)
使用者標籤,維護增量
t3 (
uid, -- 使用者ID
tag1, -- 標籤1,如興趣
tag2, -- 標籤2,如性別
tag3, -- 標籤3,如年齡段
... ,
)
透視舉例
對某品牌、某銷售區域,某標籤、某日進行透視。
例如
select
`興趣` as tag,
t3.tag1 as tag_value,
count(1) as cnt
from
t1,
t2,
t3
where
t1.uid = t3.uid
and t1.uid = t2.uid
and t2.pinpai = ?
and t1.groupid = ?
AND t1.day = `2017-06-25`
group by t3.tag1
這類查詢的運算量較大,而且分析師可能對不同的維度進行比對分析,因此建議採用預計算的方法進行優化。
預計算優化
預計算需要得到的結果如下:
t_result (
day, -- 日期
pinpai, -- 品牌ID
groupid, -- 渠道、地區、門店ID
tag1, -- 標籤型別1
tag2, -- 標籤型別2
tag3, -- 標籤型別3
... -- 標籤型別n
cnt, -- 使用者數
uids, -- 使用者ID陣列,這個為可選欄位,如果不需要知道ID明細,則不需要儲存
hll_uids -- 使用者HLL估值
)
對於GPDB,可以使用列儲存,表分割槽則按day範圍一級分割槽,按pinpai, groupid雜湊進行二級分割槽,資料分佈策略選擇隨機分佈,最後針對每個tag?欄位建立單獨索引。 從而實現快速的檢索(甭管資料量多大,單次透視請求的速度應該可以控制在100毫秒以內)。
得到這份結果後,分析師的查詢簡化如下(前三個條件通過分割槽過濾資料,最後根據tag?的索引快速得到結果):
select
day, pinpai, groupid, `tag?` as tag, cnt, uids, hll_uids
from t_result
where
day =
and pinpai =
and groupid =
and tag? = ?
預計算後,甚至能以非常少量的運算量,實現更加複雜的維度分析,例如分析某兩天的差異使用者,分析多個TAG疊加的使用者等
預計算的方法
產生統計結果的SQL如下
select
t1.day,
t2.pinpai,
t1.groupid,
t3.tag1,
t3.tag2,
t3.tag3,
...
count(1) as cnt ,
array_agg(uid) as uids,
hll_add_agg(hll_hash_integer(uid)) as hll_uids
from
t1,
t2,
t3
where
t1.uid = t3.uid
and t1.uid = t2.uid
group by
t1.day,
t2.pinpai,
t1.groupid,
grouping sets (
(t3.tag1),
(t3.tag2),
(t3.tag3),
(...),
(t3.tagn)
)
解釋:
1、將uid聚合為陣列
array_agg(uid)
2、將UID轉換為hll hash val,並聚合為HLL型別
hll_add_agg(hll_hash_integer(uid))
3、為了按每個標籤維度進行統計,可以使用多維分析語法grouping sets,不必寫多條SQL來實現,資料也只會掃一遍,將按每個標籤維度進行統計
grouping sets (
(t3.tag1),
(t3.tag2),
(t3.tag3),
(...),
(t3.tagn)
)
多維分析的語法詳見
《PostgreSQL 9.5 new feature – Support GROUPING SETS, CUBE and ROLLUP.》
《Greenplum 最佳實踐 – 多維分析的使用(CUBE, ROLLUP, GROUPING SETS in GreenPlum and Oracle)》
預計算結果透視查詢
如果進行復雜透視,可以將分析結果的不同記錄進行陣列的邏輯運算,得到最終UID集合結果。
一、陣列邏輯運算
1、在陣列1但不在陣列2的值
create or replace function arr_miner(anyarray, anyarray) returns anyarray as $$
select array(select * from (select unnest($1) except select unnest($2)) t group by 1);
$$ language sql strict;
2、陣列1和陣列2的交集
create or replace function arr_overlap(anyarray, anyarray) returns anyarray as $$
select array(select * from (select unnest($1) intersect select unnest($2)) t group by 1);
$$ language sql strict;
3、陣列1和陣列2的並集
create or replace function arr_merge(anyarray, anyarray) returns anyarray as $$
select array(select unnest(array_cat($1,$2)) group by 1);
$$ language sql strict;
例如在促銷活動前(2017-06-24)的使用者集合為UID1[],促銷活動後(2017-06-25)的使用者集合為UID2[],想知道促銷活動得到了哪些新增使用者。
arr_miner(uid2[], uid1[]) 即可得到。
二、我們使用了HLL型別,HLL本身支援資料的邏輯計算
1、計算唯一值個數
hll_cardinality(users)
2、計算兩個HLL的並集,得到一個HLL
hll_union()
例如在促銷活動前(2017-06-24)的使用者集合HLL為uid1_hll,促銷活動後(2017-06-25)的使用者集合HLL為uid2_hll,想知道促銷活動得到了多少新增使用者。
hll_cardinality(uid2_hll) - hll_cardinality(uid1_hll)
預計算排程
業務以前通過即時JOIN得到透視結果,而現在我們使用事先統計的方法得到透視結果,事先統計本身是需要排程的。
排程方法取決於資料的來源,以及資料合併的方法,流式增量或批量增量。
一、資料按天統計,歷史統計資料無更新,只有增量。
定時將統計結果寫入、合併至t_result結果表。
insert into t_result
select
t1.day,
t2.pinpai,
t1.groupid,
t3.tag1,
t3.tag2,
t3.tag3,
...
count(1) as cnt ,
array_agg(uid) as uids ,
hll_add_agg(hll_hash_integer(uid)) as hll_uids
from
t1,
t2,
t3
where
t1.uid = t3.uid
and t1.uid = t2.uid
group by
t1.day,
t2.pinpai,
t1.groupid,
grouping sets (
(t3.tag1),
(t3.tag2),
(t3.tag3),
(...),
(t3.tagn)
)
二、合併統計維度資料
每天的統計結果只有按天統計的結果,如果要查詢按月,或者按年的統計,需要對天的資料查詢並匯聚。
當然,業務也能選擇非同步匯聚,終端使用者查詢匯聚後的結果。
t_result_month (
month, -- yyyy-mm
pinpai, -- 品牌ID
groupid, -- 渠道、地區、門店ID
tag1, -- 標籤型別1
tag2, -- 標籤型別2
tag3, -- 標籤型別3
... -- 標籤型別n
cnt, -- 使用者數
uids, -- 使用者ID陣列,這個為可選欄位,如果不需要知道ID明細,則不需要儲存
hll_uids -- 使用者HLL估值
)
array聚合需要自定義一個聚合函式
postgres=# create aggregate arragg (anyarray) ( sfunc=arr_merge, stype=anyarray);
CREATE AGGREGATE
postgres=# select arragg(c1) from (values (array[1,2,3]),(array[2,5,6])) t (c1);
arragg
-------------
{6,3,2,1,5}
(1 row)
按月匯聚SQL如下
select
to_char(day, `yyyy-mm`),
pinpai,
groupid,
tag1,
tag2,
tag3,
...
array_length(arragg(uid),1) as cnt,
arragg(uid) as uids,
hll_union_agg() as hll_uids
from t_result
group by
to_char(day, `yyyy-mm`),
pinpai,
groupid,
tag1,
tag2,
tag3,
...
按年匯聚以此類推。
三、流式排程
如果業務方有實時統計的需求,那麼可以使用流式計算的方法,實時進行以上聚合統計。方法詳見
《流計算風雲再起 – PostgreSQL攜PipelineDB力挺IoT》
《基於PostgreSQL的流式PipelineDB, 1000萬/s實時統計不是夢》
《”物聯網”流式處理應用 – 用PostgreSQL實時處理(萬億每天)》
如果資料量非常龐大,可以根據分割槽鍵,對資料進行分流,不同的資料落到不同的流計算節點,最後彙總流計算的結果到HybridDB(base on GPDB)中。
《ApsaraDB的左右互搏(PgSQL+HybridDB+OSS) – 解決OLTP+OLAP混合需求》
小結
1、對於透視分析需求,使用倒轉的方法,將資料按查詢需求進行預計算,得到統計結果,從而在透視時僅需查詢計算結果,任意維度透視,都可以做到100毫秒以內的響應速度。
2、使用GROUPING SETS,對多個標籤維度進行一次性統計,降低資料重複掃描和重複運算,大幅提升處理效率。
3、使用陣列,記錄每個透視維度的UID,從而不僅能支援透視,還能支援圈人的需求。同時支援未來更加複雜的透視需求。
4、使用HLL型別,儲存估算值,在進行復雜透視時,可以使用HLL,例如多個HLL的值可以UNION,可以求唯一值個數,通常用於評估UV,新增UV等。
5、使用流計算,如果資料需要實時的統計,那麼可以使用pipelineDB進行流式分析,實時計算統計結果。(pipelineDB正在外掛化,將來使用會更加方便)
6、與阿里云云端元件結合,使用OSS物件儲存過渡資料(原始資料),使用OSS_FDW外部表對接OSS,因此過渡資料可以不入庫,僅僅用於預計算。大幅降低資料庫的寫入需求、空間需求。
7、使用Greenplum的一級、二級分割槽,將透視資料的訪問需求打散到更小的單位,然後使用標籤索引,再次降低資料搜尋的範圍,從而做到任意資料量,任意維度透視請求100毫秒以內響應。
8、使用列儲存,提升壓縮比,節省統計資料的空間佔用。
參考
https://github.com/aggregateknowledge/postgresql-hll
相關文章
- NFTScan x TiDB丨一棧式 HTAP 資料庫為 Web3 資料服務提供毫秒級多維查詢TiDB資料庫Web
- 毫秒級從百億大表任意維度篩選資料,是怎麼做到的...
- Elasticsearch如何做到億級資料查詢毫秒級返回?Elasticsearch
- 一個簡單可分享的web資料透視分析Web
- mysql 如何毫秒級同步資料到 elasticsearchMySqlElasticsearch
- 快速入門pandas進行資料探勘資料分析[多維度排序、資料篩選、分組計算、透視表](一)排序
- 雲上運維案例分享運維
- Excel資料透視表怎麼做 Excel資料透視表技巧Excel
- 1.3萬億條資料查詢如何做到毫秒級響應?
- 透過視覺化運維配置,實現故障秒級自愈視覺化運維
- 從1維到6維,一文讀懂多維資料視覺化策略視覺化
- EXCEL資料透視表工具Excel
- 少即是多:從分鐘級提升到毫秒級的PostgreSQL查詢SQL
- 【磐維資料庫】透過python訪問磐維資料庫資料庫Python
- 奔跑吧,大屏-時間+空間實時四維資料透視
- Oracle 物化檢視案例分享Oracle
- 大資料實時多維OLAP分析資料庫Apache Druid入門分享-上大資料資料庫ApacheUI
- 大資料實時多維OLAP分析資料庫Apache Druid入門分享-下大資料資料庫ApacheUI
- 三維智慧工藝,效益資料見真章 華耀電子三維智慧工藝案例分享
- WebGL-三維透視投影Web
- 透視表excel透視表怎麼做 excel的資料透視表怎麼弄Excel
- Excel資料分析入門-資料透視表Excel
- 透視美國大資料戰略大資料
- MySQL儲存毫秒資料的方法MySql
- 【安全告警資料分析之道:一】資料透視篇
- 透視美國大資料爆發全景大資料
- 百億資料,毫秒級返回,如何設計?--淺談實時索引構建之道索引
- 大資料workshop:《線上使用者行為分析:基於流式計算的資料處理及應用》之《實時資料分析:海量日誌資料多維透視》篇大資料
- LeeetCode-2889. 資料重塑:透視
- 遇見大資料視覺化 : 那些 WOW 的資料視覺化案例大資料視覺化
- ElasticSearch 億級資料檢索案例實戰Elasticsearch
- MongoDB案例分享:如何使用oplog恢復資料MongoDB
- 毫秒級返回資料,58同城 DBA 團隊選擇 TDengine 解決感測器資料處理難題
- 保姆級教程,透視分析真的不難
- python-資料分析-Pandas-4、DataFrame-資料透視Python
- 企業級知識圖譜的案例分享
- 【北亞資料恢復】sqlserver資料庫被加密的資料恢復案例分享資料恢復SQLServer資料庫加密
- EXCEL破冰 - 如何為透視表組織資料Excel