背景
DCP是目前大多數(shù)公司在進(jìn)行用戶精細(xì)化運(yùn)營和市場營銷中常用的工具藕坯,其核心的技術(shù)是快速生成用戶群矮冬;舉個(gè)栗子铃绒,運(yùn)營同學(xué)希望對用戶表里當(dāng)日注冊用戶宝穗,且訂單表里當(dāng)日有下單的用戶進(jìn)行加積分操作户秤,那么一般的處理思路是將兩張表按照用戶id進(jìn)行join,然后根據(jù)日期進(jìn)行篩選逮矛,最終得到想要的用戶群鸡号。
這種方案流程是可行的,但研發(fā)成本較高须鼎,需要基于前端交互解析成靈活的sql鲸伴,而且關(guān)聯(lián)查詢很難保障查詢效率。
案例
那么基于以上問題晋控,這里將使用多數(shù)據(jù)表交汞窗、叉、并操作實(shí)現(xiàn)用戶群的生成赡译,該方法針對百萬級用戶群生成可秒出仲吏。
如針對滿足以下條件的用戶發(fā)放會(huì)員折扣券:
針對當(dāng)天注冊新用戶中,身份為非會(huì)員用戶,且當(dāng)日有過作品創(chuàng)建裹唆;或者當(dāng)日有會(huì)員下單記錄但未成功支付的用戶
實(shí)現(xiàn)
1誓斥、根據(jù)用戶表(千萬級)生成當(dāng)日注冊子集
SELECT groupUniqArray( create_user ) from app.scene_model where create_time = now
2、根據(jù)身份表(十萬級)生成子集
SELECT groupUniqArray( user_id) from app.user_type where create_time = now and type = 0
3许帐、根據(jù)作品表(億級)生成子集
SELECT groupUniqArray( user_id) from app.scene_model where create_time = now
4劳坑、根據(jù)訂單表(千萬級)生成子集
SELECT groupUniqArray( user_id) from app.order_model where create_time = now and success = 0
那么我們對前三個(gè)用戶子集進(jìn)行求交,再與第四個(gè)用戶子集取并將得到我們想要的用戶群舞吭。最終代碼如下:
with ( SELECT groupUniqArray( create_user ) from app.scene_model where create_time = now )as users1,
( SELECT groupUniqArray( user_id) from app.user_type where create_time = now and type = 0 )as users2 ,
( SELECT groupUniqArray( user_id) from app.scene_model where create_time = now ) as users3 ,
( SELECT groupUniqArray( user_id) from app.scene_model where create_time = now ) as users4
SELECT arrayDistinct( arrayConcat( arrayIntersect( users1,users2, users3) ,users4 ) ) as user_ids
優(yōu)化
1泡垃、由于用戶選擇數(shù)據(jù)集的過程是順序完成的,所以當(dāng)用戶完成一個(gè)數(shù)據(jù)子集后可對其進(jìn)行緩存羡鸥,在求交時(shí)性能會(huì)大幅提升
create table users1 ENGINE = Memory
as
SELECT groupUniqArray( create_user ) from app.scene_model where create_time = now
2蔑穴、對群結(jié)果進(jìn)行緩存
create table uids engin=Memory as SELECT arrayDistinct( arrayConcat( arrayIntersect( users1,users2, users3) ,users4 ) )