clickhouse資料模型之留存分析

2021-10-24 16:32:07 字數 2694 閱讀 1740

關於使用者留存模型是各大商業資料分析平台必不可少的功能,企業一般用該模型衡量使用者的活躍情況,也是能直接反應產品功能價值的直接指標;如,boss想要了解**改版後,對使用者加購以及後續下單情況的影響等。如下圖,這就是乙個典型的留存分析功能:

通常實現上述需求的傳統做法是多表關聯,了解clickhouse的攻城獅都清楚,多表關聯簡直就是clickhouse的天敵;如一張使用者行為日誌表中至少包含:使用者id、行為事件、操作時間、地點屬性等,想分析20200909日河南省註冊使用者次日的下單情況,那麼sql一般會這麼寫:

select count(distinct t1.uid) r1, count(distinct t2.uid) r2 from

( select uid from action_log where day='20200909' and action='login' and province='河南省'

) as t1 left join

( select uid from action_log where day='20200910' and action='order' and province='河南省'

) as t2

using uid

這種方式書寫簡單、好理解,但是效能會很差,在超大資料集上進行運算是不僅僅影響使用者體驗,還會因長期占有物理資源而拖垮整個clickhouse上的業務。

解決方法有兩種:

bitmap可以理解為乙個長度很長且只儲存0/1數字的集合,如某個使用者通過特定的雜湊演算法對映到位圖內時,那麼該位置就會被置為1,否則為0;通過這種方式對資料進行壓縮,空間利用率可提示數十倍,資料可以很容易被系統cache,大大減少了io操作。

在查詢之前需要先對資料進行預處理,這裡額外構建兩張表,用來儲存使用者的點陣圖資訊。

向位圖表插入資料,原始資料十幾億,插入後結果只有幾萬行,而且隨著資料範圍的再擴大,位圖表的資料增量變化也不會很明顯

同理table_attribute_bit插入後資料也得到了極大的壓縮,最終資料如下圖:

其中bitmapcardinality用來計算點陣圖中不重複資料個數,在大資料量下會有一定的資料誤差,bitmapand用來計算兩個bitmap的與操作,即返回同時出現在兩個bitmap中使用者數量

該方法的確比較靈活,不僅僅能解決留存問題,還有很多關於事件分析的需求等待我們去探索;然而它的缺點是操作複雜,且不支援對實時資料的分析

retention(cond1, cond2, ..., cond32);

## cond 為判斷條件

## 支援最長32個引數的輸入,也就是說 至少支援乙個完整自然月的留存分析查詢

其中滿足條件1的資料會置為1,之後的每乙個表示式成立的前提都要建立在條件1成立的基礎之上,這正好符合我們對留存模型的定義

那麼我們還以上面的3個場景為例方便對比說明:

select

sum(r[1]) as r1,

sum(r[2]) as r2,

r2/r1

from

(select

uid,

from action_log

where date in ('20200701', '20200702')

group by uid

)

select

sum(r[1]) as r1,

sum(r[2]) as r2,

r2/r1

from

(select

uid,

from action_log

where date in ('20200701', '20200702') and province in ('廣東', '江西', '河南')

group by uid

)

不過該方式與bitmap比也有缺陷,那就是如果使用者日誌表中不儲存使用者屬性資訊時,就需要與使用者屬性表進行關聯查詢,兩張大表關聯,查詢效能會相當慢。

概念資料模型 邏輯資料模型 物理資料模型

概念資料模型設計與邏輯資料模型設計 物理資料模型設計是資料庫及資料倉儲模型設計的三個主要步驟。在資料倉儲領域有乙個概念叫conceptual data model,中文一般翻譯為 概念資料模型 概念資料模型是終端使用者對資料儲存的看法,反映了終端使用者綜合性的資訊需求,它以資料類的方式描述企業級的資...

概念資料模型,邏輯資料模型,物理資料模型

在資料倉儲領域有乙個概念叫conceptual data model,中文一般翻譯為 概念資料模型 概念資料模型是終端使用者對資料儲存的看法,反映了終端使用者綜合性的資訊需求,它以資料類的方式描述企業級的資料需求,資料類代表了在業務環境中自然聚集成的幾個主要類別資料。概念資料模型的內容包括重要的實體...

ExtJS之資料模型

extjs的資料模型主要包括以下幾部分 資料實體模型代表了應用系統中用到的資料實體,如在電子商務系統中的使用者資訊 users 產品資訊 products 賬單資訊 orders 等。資料 用來處理資料的讀取和儲存,如通過ajax 獲取伺服器端的資料。資料讀寫器用於讀取原始資料到model資料實體模...