2023
用户
画像
文档
用户画像文档
用户画像
目录
TOC \o 1-3 \h \z \u 一、概念 3
二、标签库设计: 3
三、用户性别、年龄识别过程: 3
四、用户画像本体表数据入库hbase 5
五、用户画像程序执行 6
概念
用户画像:
用户画像也叫用户信息标签化、客户信息。
根据用户的信息和行为动作,用一些标签把用户描绘出来,描绘的标签就是用户画像。
appID:
用于标记APP,APP的唯一编号,判断终端安装的APP。
年龄段说明:
名称
说明
年龄段1
24岁以下
年龄段2
25-30岁
年龄段3
31-35岁
年龄段4
36-40岁
年龄段5
40岁以上
标签库设计:
标签库的设计,主要是针对应用市场上主流的App,对App进行分类,App分类信息包括:App名称,男女权重信息,各个年龄段的权重信息。
AppID
App名称
男性权重
女性权重
年龄段1
年龄段2
年龄段3
年龄段4
年龄段5
见appTab表:
10001|QQ|0.001|0.001|0|0.2|0.3|0.2|0.3
10002|飞信|0.001|0.001|0|0.2|0.3|0.2|0.3
10003|MSN|0.001|0.001|0|0.2|0.3|0.2|0.3
10004|阿里旺旺|0.001|0.001|0|0.2|0.3|0.2|0.3
10005|微信|0.001|0.001|0|0.2|0.3|0.2|0.3
10006|陌陌|0.001|0.001|0|0.2|0.3|0.2|0.3
10007|米聊|0.001|0.001|0|0.2|0.3|0.2|0.3
10008|啪啪|0.001|0.001|0|0.2|0.3|0.2|0.3
10009|飞聊|0.001|0.001|0|0.2|0.3|0.2|0.3
10010|来往|0.001|0.001|0|0.2|0.3|0.2|0.3
10011|连我|0.001|0.001|0|0.2|0.3|0.2|0.3
10012|有你|0.001|0.001|0|0.2|0.3|0.2|0.3
用户性别、年龄识别过程:
必备条件:性别比例、年龄比例必须在识别出AppID后进行,如果AppID编号为空,那么不做处理。
性别和年龄的判断,都依赖于标签库的设计,也就是用户 安装的App,根据 App计算用户的性别和年龄权重信息,最后判断用户的年龄和性别。
源代码:
对男女性别的计算:
public void protraitSex(double male2, double female2, long times) {
double sum = (this.male + this.female + (male2 + female2) x times);
if(sum != 0){
this.male = (this.male + male2 x times) / sum;
this.female = (this.female + female2 x times) / sum;
}
}
2、对年龄段的计算:
public void protraitAge(double pAge1, double pAge2, double pAge3, double pAge4, double pAge5, long times) {
double sum = (age1 + age2 + age3 + age4 + age5 ) // 之前的APP的+ (pAge1 + pAge2 + pAge3 + pAge4 + pAge5 ) x times;// 当前的APP的if(sum != 0){
this.age1 = (pAge1 x times + age1) / sum;
this.age2 = (pAge2 x times + age2) / sum;
this.age3 = (pAge3 x times + age3) / sum;
this.age4 = (pAge4 x times + age4) / sum;
this.age5 = (pAge5 x times + age5) / sum;
}
}
表结构:用户画像本体表
字段名
类型
长度
默认值
说明
备注
日期
记录历史时间
MSISDN
byte
16
全F
号
男性权重
女性权重
年龄段1权重
年龄段2权重
年龄段3权重
年龄段4权重
年龄段5权重
汇总周期:每天汇总一次,建议当天凌晨统计前一天数据
画像数据:+2SJcwT8h0TSsxVd2pBMjA==|0.508|0.492|0.1|0.2|0.2|0.2|0.3|+2YYprC2jdMfQntMAn8lmA==|0.4|0.6|0.0|0.1|0.3|0.3|0.3|+2k9y/1uapW4IW6LUq0LGQ==|0.7|0.3|0.0|0.2|0.3|0.2|0.3|+3M/cSZerfq+XDC9kMWWcA==|0.5|0.5|0.1|0.2|0.2|0.2|0.3|+3NZW71R8R8nL78M3JB8tw==|0.5|0.5|0.1|0.2|0.2|0.2|0.3|+40FbnopHa5sY/CzDDf8cg==|0.5|0.5|0.0|0.2|0.3|0.2|0.3|+5k9calLrKDGvHyzvO0pvg==|0.5|0.5|0.1|0.2|0.2|0.2|0.3|+5wU5NlU1iJUZ5sMN91DUw==|0.5|0.5|0.2|0.2|0.2|0.2|0.2|+69Ng7CRkKTr2hbYtgeiAw==|0.8|0.2|0.0|0.2|0.3|0.2|0.3|+6YeD7QUw8Hy6qN7Dxk7vQ==|0.8|0.2|0.0|0.2|0.3|0.2|0.3|+A4H4S++fiGw3pKi8xpwrw==|0.698|0.302|0.0|0.199|0.3|0.201|0.3|+AJEIaelS8LGbHqdDaorzg==|0.7|0.3|0.0|0.6|0.3|0.05|0.05|+AbbMhECgaMivqZBr/U+Aw==|0.5|0.5|0.1|0.2|0.2|0.2|0.3|
用户画像本体表数据入库hbase
创立hbase表:
create 'user_draw',{NAME=>'draw',VERSIONS=>1,BLOCKCACHE=>true,BLOOMFILTER=>'ROW',COMPRESSION=>'SNAPPY'},{SPLITS => ['/','+','0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z']}
入库hbase代码:
for (Text v2 : val) {
String[] splited = v2.toString().split(\\|);
//rowkey
if(k2.toString().length()!=0){
Put put = new Put(Bytes.toBytes(k2.toString()));
//跳过写入Hlog,提高写入速度
put.setDurability(Durability.SKIP_WAL);
put.add(Bytes.toBytes(draw), Bytes.toBytes(mdn), Bytes.toBytes(splited[1]));
put.add(Bytes.toBytes(draw), Bytes.toBytes(male), Bytes.toBytes(splited[2]));
put.add(Bytes.toBytes(draw), Bytes.toBytes(female), Bytes.toBytes(splited[3]));
put.add(Bytes.toBytes(draw), Bytes.toBytes(age1), Bytes.toBytes(splited[4]));
put.add(Bytes.toBytes(draw), Bytes.toBytes(age2), Bytes.toBytes(splited[5]));
put.add(Bytes.toBytes(draw), Bytes.toBytes(age3), Bytes.toBytes(splited[6]));
put.add(Bytes.toBytes(draw), Bytes.toBytes(age4), Bytes.toBytes(splited[7]));
put.add(Bytes.toBytes(draw), Bytes.toBytes(age5), Bytes.toBytes(splited[8]));
context.write(NullWritable.get(), put);
}
}
用户画像程序执行
程序运行环境:hadoop集群、zookeeper、hbase。
appTab.txt规那么库表hdfs路径:/home/appTab.txt
程序执行jar包:userdraw.jar
程序执行命令:hadoop jar userdraw.jar 数据输入路径 job1输出路径 job2输出路径
文件编码问题需要注意!!!