系列隨筆:
(二)基於商品屬性的相似商品推薦算法——Flink SQL實時計算實現商品的隱式評分
(三)基於商品屬性的相似商品推薦算法——批量處理商品屬性,得到屬性前綴及完整屬性字符串
(四)基於商品屬性的相似商品推薦算法——推薦與評分高的商品屬性相似的商品
2020.04.15 補充:協同過濾推薦算法.pptx
提取碼:4tds
注:如果你沒有使用日志埋點和實時計算(接口直接累計也是可行的),你可以直接跳到這一節~
Flink SQL實時計算實現商品的隱匿評分
一、導入log service日志源表
二、導入評分配置維度表(用戶行為的評分配置)
三、導入用戶商品評分維表
四、用戶評分結果表
四、預處理日志數據
-- 處理日志數據 CREATE VIEW probe_log0_view AS SELECT t1.cid, CAST(memberCode as INT) as memberCode, t1.event, t1.eventApp, TO_TIMESTAMP(CAST(CAST(__timestamp__ as DOUBLE) as BIGINT)*1000) as eventTime, CAST(IF (SUBSTRING(t1.eventProps,0,1)='%', REGEXP_EXTRACT(t1.eventProps, concat(t2.code_name,'\\%22:(\\d+),'), 1), JSON_VALUE (t1.eventProps, concat('$.',t2.code_name))) as INT) as goodsCode, t2.score FROM probe_log0 t1 LEFT JOIN rc_config_dimension FOR SYSTEM_TIME AS OF PROCTIME() AS t2 ON t1.event=t2.event AND t2.status=1 WHERE t1.event IN ('viewGoods','shareGoods','collectGoods','addToCart');
注:eventProps為埋點的擴展json數據,因為小程序的埋點不太規范,所以加了額外的判斷;正常來說,直接使用 JSON_VALUE 函數即可
五、寫入結果表
-- 入庫 INSERT INTO rc_member_goods (member_code, cid, goods_code, score, update_time) SELECT t1.memberCode, t1.cid, t1.goodsCode, CAST(IF(t2.score IS NOT NULL, t2.score, 0) + SUM(t1.score) as INT) AS score, MAX(t1.eventTime) as update_time FROM probe_log0_view t1 LEFT JOIN rc_member_goods_dimension FOR SYSTEM_TIME AS OF PROCTIME() AS t2 ON t1.memberCode=t2.member_code AND t1.cid=t2.cid AND t1.goodsCode=t2.goods_code WHERE t1.goodsCode IS NOT NULL AND (t1.eventTime > t2.update_time OR t2.update_time IS NULL) GROUP BY t1.memberCode, t1.cid, t1.goodsCode, t2.score;
注:這里的難點在於 CAST(IF(t2.score IS NOT NULL, t2.score, 0) + SUM(t1.score) as INT) AS score 和 AND (t1.eventTime > t2.update_time OR t2.update_time IS NULL)
意思是:如果rc_member_goods表中沒有記錄的,就直接加入;如果 rc_member_goods 中有記錄的,則判斷 eventTime 是否大於 上前的更新時間(防止重復更新),最后累計上當前的日志分
PS:如果沒有 t2.update_time IS NULL 則左連接會變成 left outer join
上一節:(一)基於商品屬性的相似商品推薦算法——整體框架及處理流程
下一節:(三)基於商品屬性的相似商品推薦算法——批量處理商品屬性,得到屬性前綴及完整屬性字符串