公司前期做智能营销,其中有一个基于标签全选人群的操作,让广告主能看到在当前标签条件下,能够全选多少人群,从而做到最大投放收益效果
1、产品背景
公司要实现一套基于标签的投放平台;主要想基于广告主给定的标签来圈定人群。然后在将广告投放出去,达到精准投放的效果;
2、页面产品
页面大概涨这个样子:
3、数据量
3.1、每天日活的用户大概300万左右,假如90天90秒的活用用户量为600万
3.2、产品数量大概在3000个
3.3、多个标签维度,比如有50个标签维度
3.4、地域维度
综上所属,假如90天90秒的活跃用户量为600万,在标签维度和产品数量等交叉后出现的结果总量不会小于百亿......
4、项目前期处理方式
前期处理的调用链非常不合理,大概的意思是:
从上图能看出调用链非常的长,而且服务端和数据端耦合性特别高,是一种非常不合理的设计方案;
而且上述的处理方式,广告主想要获取人群的试算结果,需要等若干个小时,用户体验也特别不好;
5、基于ck进行优化处理
为什么我们这里要使用ck?
上面简单介绍过每天的日活,以及各种维度标签,当他们进行多维交叉处理后,产生的数据量非常惊人.即便是hive也是很吃力的,而且处理响应速度慢,用户体验差;
那么为什么使用ck后,就可以优化处理,用户体验变好?上面提到过,有可能多维交叉处理后,出现百亿条数据,即便是ck,这么多行数据,也是吃力的;
因此,我们使用了ck的一些数组和数组函数.将多条数据进行压缩处理;
比如:
正常在hive,当前表的schema表现形式是:
1 CREATE TABLE hive的表 2 ( 3 `dt` String DEFAULT '9999-01-11' COMMENT '时间', 4 `dvid` String DEFAULT '-9999' COMMENT '设备ID', 5 `car_model_id` String DEFAULT '-9999' COMMENT '本品ID', 6 `car_model_cp_id` String DEFAULT '-9999' COMMENT '竞品ID', 7 `package_type` String DEFAULT '-9999' COMMENT '人群包类型', 8 `age_range` String DEFAULT '-9999' COMMENT '年龄范围', 9 `city_level_id` String DEFAULT '-9999' COMMENT '城市级别', 10 `pricerange_id` String DEFAULT '-9999' COMMENT '价格偏好', 11 `car_level2_id` String DEFAULT '-9999' COMMENT '级别偏好', 12 `carbrand_id` String DEFAULT '-9999' COMMENT '品牌偏好', 13 `province_id` String DEFAULT '-9999' COMMENT '省份偏好', 14 `city_id` String DEFAULT '-9999' COMMENT '城市偏好', 15 `is_yest_dau` Int16 DEFAULT -9999 COMMENT '是否昨日日活(0不是 1是)', 16 `is_yest_recom_dau` Int16 DEFAULT -9999 COMMENT '是否昨日首页推荐日活(0不是 1是)', 17 `create_date` Date DEFAULT now() COMMENT '创建时间' 18 )