前言


本案例是一个专注于flink动态规则计算的项目,核心技术组件涉及flink、hbase、clickhouse、drools等
项目可根据各类个性化需求进行二次开发后,直接用于实时运营,实时风控、交通监控等场景的线上生产

flink参数动态配置 flink动态规则_flink动态规则

画像标签体系

  • 用户基本属性标签
  • 用户订单属性标签
  • 用户退换货属性标签
  • 用户购物车属性标签
  • 用户活跃属性标签
  • 用户偏好属性标签

用户基本属性标签

用户属性指标主要根据业务数据来源(业务系统中的用户信息)
尽可能全面地描述用户基础属性
这些基础属性值是短期内不会有改变的,如年龄、性别、手机号归属地、身份证归属地等

字段

类型

定义

备注

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();
    }
}