前言
项目介绍在线视频: /video/BV1zv41157yY
本案例是一个专注于flink动态规则计算的项目,核心技术组件涉及flink、hbase、clickhouse、drools等
项目可根据各类个性化需求进行二次开发后,直接用于实时运营,实时风控、交通监控等场景的线上生产
项目完整视频教程和资料代码等,可在易学在线 获取
技术交流,可加微信: haitao-duan
画像标签体系
用户基本属性标签用户订单属性标签用户退换货属性标签用户购物车属性标签用户活跃属性标签用户偏好属性标签用户基本属性标签
用户属性指标主要根据业务数据来源(业务系统中的用户信息)
尽可能全面地描述用户基础属性
这些基础属性值是短期内不会有改变的,如年龄、性别、手机号归属地、身份证归属地等
用户登录活跃标签
看用户近期登录时间段、登录时长、登录频次、常登陆地等指标
用户年龄段标签
在做营销活动或站内推送时,可对不同年龄段做针对性运营
用户交互行为标签
记录用户在平台上每一次操作行为,及该次行为所带来的标签。后续可根据用户的行为标签计算用户的偏好标签,做推荐和营销等活动
用户消费能力标签
看用户的消费金额、消费频次、最近消费时间。进一步结合用户登录活跃情况,可以对用户做RFM分层。
用户订单画像标签
用户退拒货行为画像标签
用户购物偏好画像标签
画像标签存储及表结构
画像数据,行数基本与公司用户规模相同;
列数则众多(一个中型互联网企业,用户的画像标签通常都在1000-2000个之间),而且会在实际运营中,不断增加新的标签,则会不断增加新的列;
考虑到行数及列数规模巨大(数亿行*数千列),以及列的动态增加特性,业内通常将用户画像标签数据存于Hbase之中,再辅以elastic search做二级索引,以实现对hbase中画像数据的快速检索;
用户画像整体技术架构
关于用户画像,限于本课程的侧重点和篇幅,这里就不详细展开了。
有兴趣的朋友,可以学习多易教育的数据分析类项目课程《Titan综合数据运营系统》
/detail/p_5fba7371e4b04db7c0903f2b/8
用户画像库数据模拟
假设公司已有的用户画像库,存储在hbase中,表结构为如下
列簇 f
可用数据模拟器快速生成约100万个用户的画像标签数据(每个用户1000个标签)
/*** @author 涛哥* @nick_name "deep as the sea"* @contact qq:657270652 wx:doit_edu* @site * @date -03-27* @desc 用户画像数据模拟器* <p>* deviceid,k1=v1* <p>* hbase中需要先创建好画像标签表* [root@hdp01 ~]# hbase shell* hbase> create 'yinew_profile','f'*/public class UserProfileDataGen {public static void main(String[] args) throws IOException {Configuration conf = new Configuration();conf.set("hbase.zookeeper.quorum", "hdp01:2181,hdp02:2181,hdp03:2181");Connection conn = ConnectionFactory.createConnection(conf);Table table = conn.getTable(TableName.valueOf("yinew_profile"));ArrayList<Put> puts = new ArrayList<>();for (int i = 1; i < 1000000; i++) {// 生成一个用户的画像标签数据String deviceId = StringUtils.leftPad(i + "", 6, "0");Put put = new Put(Bytes.toBytes(deviceId));for (int k = 1; k <= 100; k++) {String key = "tag" + k;String value = "v" + RandomUtils.nextInt(1, 101);put.addColumn(Bytes.toBytes("f"), Bytes.toBytes(key), Bytes.toBytes(value));}// 将这一条画像数据,添加到list中puts.add(put);// 提交一批// 攒满100条一批if(puts.size()==100) {table.put(puts);puts.clear();}}if(puts.size()>0) table.put(puts);conn.close();}}