前言
本案例是一个专注于flink动态规则计算的项目,核心技术组件涉及flink、hbase、clickhouse、drools等项目可根据各类个性化需求进行二次开发后,直接用于实时运营,实时风控、交通监控等场景的线上生产
画像标签体系
- 用户基本属性标签
- 用户订单属性标签
- 用户退换货属性标签
- 用户购物车属性标签
- 用户活跃属性标签
- 用户偏好属性标签
用户基本属性标签
用户属性指标主要根据业务数据来源(业务系统中的用户信息)
尽可能全面地描述用户基础属性
这些基础属性值是短期内不会有改变的,如年龄、性别、手机号归属地、身份证归属地等
字段 | 类型 | 定义 | 备注 |
user_id | bigint | 用户编码 | |
login_name | string | 登录名称 | |
user_name | string | 用户姓名 | |
user_status_id | int | 用户状态 | |
gender_id | int | 用户性别 | |
birthday | int | 用户生日 | |
user_age | int | 用户年龄 | |
constellation_name | string | 星座名称 | |
zodiac_name | string | 生肖名称 | |
cellphone_id | string | 手机号 | |
cert_id | string | 证件号 | |
source_id | bigint | 注册来源 | |
is_real_name_auth | int | 是否实名认证标志 | |
is_valid_cellphone | int | 是否认证手机标志 | |
is_has_photo | int | 是否有头像标志 | |
is_tmp_user_flag | timestamp | 注册时间 | |
create_time | string | 注册日期 | |
create_date | timestamp | 修改时间 | |
modify_time | string | 修改时间 | |
modify_date | timestamp | 修改日期 | |
date_id | string | 数据日期 |
用户登录活跃标签
看用户近期登录时间段、登录时长、登录频次、常登陆地等指标
字段 | 类型 | 定义 | 备注 |
user_id | int | 用户id | 用户唯一id |
login_city_ration | string | 常登陆地 | 用户近一个月常登陆的3个地点及比率 |
last_online_date | string | 最近登陆时间 | 用户最近一次登录日期 |
online_frequency | int | 登录频次 | 用户近一个月登录频次 |
online_time | int | 登录时长 | 用户近一个月登录时长 |
用户年龄段标签
在做营销活动或站内推送时,可对不同年龄段做针对性运营
字段 | 类型 | 定义 | 备注 |
user_id | string | 用户编码 | |
contact_id | string | 联系人编码 | |
user_sex | string | 用户性别 | |
user_age_crowd | string | 用户年龄群体 | 儿童(0-10)少年(11-15)… |
用户交互行为标签
记录用户在平台上每一次操作行为,及该次行为所带来的标签。后续可根据用户的行为标签计算用户的偏好标签,做推荐和营销等活动
字段 | 类型 | 定义 | 备注 |
user_id | string | 用户id | 用户唯一id |
org_id | string | 原始id | 标签id |
org_name | string | 标签中文名称 | 标签对应标签的中文名称 |
is_valid | string | 是否有效 | 1有效 |
cnt | string | 行为次数 | 用户行为次数 |
date_id | string | 行为日期 | 产生用户该条标签对应日期 |
act_type_id | int | 用户行为类型 | 1搜索2浏览3收藏4下单5支付6退货 |
tag_type_id | int | 频道类型 | 1母婴2家电3美妆4美食5服装6鲜花 |
用户消费能力标签
看用户的消费金额、消费频次、最近消费时间。进一步结合用户登录活跃情况,可以对用户做RFM分层。
字段 | 类型 | 定义 | 备注 |
user_id | string | 用户编码 | |
sum_pay | string | 累积付费金额 | |
sum_num | decimal | 累积付费次数 | |
paid_level | int | 付费分层 | 1:[0,30) |
用户订单画像标签
字段 | 类型 | 定义 | 备注 |
user_id | bigint | 用户 | |
first_order_time | string | 首单日期 | |
last_order_time | string | 末单日期 | |
first_order_ago | bigint | 首单距今时间 | |
last_order_ago | bigint | 末单距今时间 | |
month1_order_cnt | bigint | 近30天购买次数 | |
month1_order_amt | double | 近30天购买金额 | |
month2_order_cnt | bigint | 近60天购买次数 | |
month2_order_amt | double | 近60天购买金额 | |
month3_order_cnt | bigint | 近90天购买次数 | |
month3_order_amt | double | 近90天购买金额 | |
max_order_amt | double | 最大订单金额 | |
min_order_amt | double | 最小订单金额 | |
total_order_cnt | bigint | 累计消费次数(不含退拒) | |
total_order_amt | double | 累计消费金额(不含退拒) | |
total_coupon_amt | double | 累计使用代金券金额 | |
user_avg_order_amt | double | 平均订单金额(含退拒) | |
month3_user_avg_amt | double | 近90天平均订单金额(含退拒) | |
common_address | string | 常用收货地址 | |
common_paytype | string | 常用支付方式 | |
month1_cart_cnt_30 | bigint | 最近30天加购次数 | |
month1_cart_goods_cnt_30 | bigint | 最近30天加购商品件数 | |
month1_cart_submit_cnt_30 | bigint | 最近30天提交件数 | |
month1_cart_submit_rate | double | 最近30天商品提交占比 | |
month1_cart_cancel_cnt | bigint | 最近30天取消商品件数 | |
dw_date | string | 计算日期 |
用户退拒货行为画像标签
字段 | 类型 | 定义 | 备注 |
user_id | bigint | 用户 | |
p_sales_cnt | bigint | 不含退拒商品购买数量 | |
p_sales_amt | double | 不含退拒商品购买的商品总价 | |
p_sales_cut_amt | double | 不含退拒实付金额(扣促销减免) | |
h_sales_cnt | bigint | 含退拒购买数量 | |
h_sales_amt | double | 含退拒购买金额 | |
h_sales_cut_amt | double | 含退拒购买金额(扣促销减免) | |
return_cnt | bigint | 退货商品数量 | |
return_amt | double | 退货商品金额 | |
reject_cnt | bigint | 拒收商品数量 | |
reject_amt | double | 拒收商品金额 | |
dw_date | bigint | 数仓计算日期 |
用户购物偏好画像标签
字段 | 类型 | 定义 | 备注 |
user_id | bigint | 用户 | |
common_first_cat | bigint | 最常购买一级类目名称 | |
common_second_cat | bigint | 最常购买二级类目名称 | |
common_third_cat | bigint | 最常购买三级类目名称 | |
common_brand_id | bigint | 最常购买的品牌 | |
dw_date | bigint | 数仓计算日期 |
画像标签存储及表结构
画像数据,行数基本与公司用户规模相同;
列数则众多(一个中型互联网企业,用户的画像标签通常都在1000-2000个之间),而且会在实际运营中,不断增加新的标签,则会不断增加新的列;
考虑到行数及列数规模巨大(数亿行*数千列),以及列的动态增加特性,业内通常将用户画像标签数据存于Hbase之中,再辅以elastic search做二级索引,以实现对hbase中画像数据的快速检索;
rowkey(deviceId) | sex | age | vip | … |
1200212 | 1 | 32 | vip-1 | … |
1200213 | 0 | 28 | vip-2 | … |
用户画像整体技术架构
关于用户画像,限于本课程的侧重点和篇幅,这里就不详细展开了。
用户画像库数据模拟
假设公司已有的用户画像库,存储在hbase中,表结构为如下
列簇 f
rowkey(deviceId) | sex | age | vip | … |
1200212 | 1 | 32 | vip-1 | … |
1200213 | 0 | 28 | vip-2 | … |
可用数据模拟器快速生成约100万个用户的画像标签数据(每个用户1000个标签)
/**
* @author 涛哥
* @nick_name "deep as the sea"
* @contact qq:657270652 wx:doit_edu
* @site www.doitedu.cn
* @date 2021-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();
}
}