DWM 層 跳出明細計算

2021-10-21 18:13:53 字數 3819 閱讀 9505

跳出就是使用者成功訪問了**的乙個頁面後就退出,不在繼續訪問**的其它頁面。而跳出率就是用跳出次數除以訪問次數。

關注跳出率,可以看出引流過來的訪客是否能很快的被吸引,渠道引流過來的使用者之間的質量對比,對於應用優化前後跳出率的對比也能看出優化改進的成果。

首先要識別哪些是跳出行為,要把這些跳出的訪客最後乙個訪問的頁面識別出來。那麼要抓住幾個特徵:

➢ 該頁面是使用者近期訪問的第乙個頁面

這個可以通過該頁面是否有上乙個頁面(last_page_id)來判斷,如果這個表示為空,就說明這是這個訪客這次訪問的第乙個頁面。

➢ 首次訪問之後很長一段時間(自己設定),使用者沒繼續再有其他頁面的訪問。

這第乙個特徵的識別很簡單,保留 last_page_id 為空的就可以了。但是第二個訪問的判斷,其實有點麻煩,首先這不是用一條資料就能得出結論的,需要組合判斷,要用一條存在的資料和不存在的資料進行組合判斷。而且要通過乙個不存在的資料求得一條存在的資料。更麻煩的他並不是永遠不存在,而是在一定時間範圍內不存在。那麼如何識別有一定失效的組合行為呢?

最簡單的辦法就是 flink 自帶的cep技術。這個cep非常適合通過多條資料組合來識別某個事件。

使用者跳出事件,本質上就是乙個條件事件加乙個超時事件的組合。

確認新增了 cep 的依賴包

設定時間語義為事件時間並指定資料中的 ts 欄位為事件時間

由於這裡涉及到時間的判斷,所以必須設定資料流的 eventtime 和水位線。這裡沒有設定延遲時間,實際生產情況可以視亂序情況增加一些延遲。

增加延遲把 formonotonoustimestamps 換為 forboundedoutoforderness 即可。

注意:flink1.12 預設的時間語義就是事件時間,所以不需要執行env.setstreamtimecharacteristic(timecharacteristic.eventtime);

//todo 4. 指定事件時間字段

singleoutputstreamoperator

jsonobjwithtsds = jsonobjds.

assigntimestampsandwatermarks

(// 注意此處 watermarkstrategy.

watermarkstrategy.

formonotonoustimestamps()

.withtimestampassigner

(new

serializabletimestampassigner

()})

);

根據日誌資料的 mid 進行分組

因為使用者的行為都是要基於相同的 mid 的行為進行判斷,所以要根據 mid 進行分組。

//todo 5.按照mid進行分組

keyedstreamkeybymidds = jsonobjwithtsds.keyby(

jsonobj -> jsonobj.getjsonobject("common").getstring("mid")

);

配置 cep 表示式

/*

計算頁面跳出明細,需要滿足兩個條件

1.不是從其它頁面跳轉過來的頁面,是乙個首次訪問頁面

last_page_id == null

2.距離首次訪問結束後10秒內,沒有對其它的頁面再進行訪問

*///todo 6.配置cep表示式

pattern

pattern = pattern.

begin

("first").

where

(//模式1:不是從其它頁面跳轉過來的頁面,是乙個首次訪問頁面

new******condition

()return

false;}

}).next

("next").

where

(//模式2. 判讀是否對頁面做了訪問

new******condition

()return

false;}

})//3.時間限制模式

根據表示式篩選流

//todo 7.根據:cep表示式篩選流

patternstream

patternstream = cep.

pattern

(keybymidds, pattern)

;

提取命中的資料, 將超時的資料放到側輸出流

➢ 設定超時時間標識 timeouttag

➢ flatselect 方法中,實現 patternflattimeoutfunction 中的 timeout 方法。

➢ 所有 out.collect 的資料都被打上了超時標記

➢ 本身的 flatselect 方法因為不需要未超時的資料所以不接受資料。

通過 sideoutput 側輸出流輸出超時資料

//todo 8.從篩選之後的流中,提取資料   將超時資料  放到側輸出流中

outputtag

timeouttag =

newoutputtag

("timeout");

singleoutputstreamoperator

filterds = patternstream.

flatselect

( timeouttag,

//處理超時資料

newpatternflattimeoutfunction

()}}

,//處理的沒有超時資料

newpatternflatselectfunction

()})

;//todo 9.從側輸出流中獲取超時資料

datastream

jumpds = filterds.

getsideoutput

(timeouttag)

;">>>>>");

將跳出資料寫回到 kafka 的 dwm 層

//todo 10.將跳出資料寫回到kafka的dwm層

jumpds.

addsink

(mykafkautil.

getkafkasink

(sinktopic)

);

利用測試資料驗證

datastream

datastream = env

.fromelements

(",\"page\":,\"ts\":10000} "

,",\"page\":,\"ts\":12000}"

,",\"page\":,\"ts\":150000} "

,",\"page\":,\"ts\":300000} "

);

檢視控制台以及 dwm_user_jump_detail 輸出效果

注意:為了看效果,設定並行度為 1

c 跳出五層迴圈例題

問題 先讀入5個1 9 之間的數字 各資料用空格分開 然後判斷這五個數字是否可以組成2個數 乙個兩位數,乙個三位數 使得其中乙個數恰好是另乙個數的平方,如果可以 多解時,只需輸出乙個解 就從小到大輸出這兩個數 中間用空格隔開 如果不可以,則輸出2個用空格隔開的0。輸入輸出樣例 輸入 1 1 2 4 ...

關於命名規範 維度明細層及集市彙總層設計的思考

在sn做倉庫專案,根據自己負責的內容及sn的一些規範等,將這一階段的模型工作進行乙個思考和總結。一 倉庫字段 表等命名的規範 資料倉儲建設目的,其中重要的乙個方面就是建立統一的全域性檢視 表 欄位等的規範命名就是倉庫全域性檢視乙個方面的體現。在進行規範命名的時候,一般會根據 資料建模字段簡寫命名規範...

跳出資料計算拯救人智慧型

醒醒吧演算法工程師們 大家都知道現在的機器學習都是概率計算或是資料擬合方程得到可能發生的概率 所以識別不是特別的高原因在於人類根本不會這樣做。在遇到難題時人們靠的基本是事件之間的聯絡進行邏輯關係的推理判斷 很少有扔硬幣的習慣 所以人類的智慧型在於邏輯推算而不是概率大的事情 邏輯只有0,1並沒有0.5...