背景介绍
在推荐系统的粗排和精排系统中,一般都需要在用户侧和物品侧设计大量的统计特征、序列特征、组合特征;基于统计特征还可以设计lookup、match特征等衍生特征。例如一个用户侧的偏好类目统计特征f1(KV类型特征),需要经历离线统计、组合为Lookup特征供离线训练;在线推理的时候需要把f1同步到在线系统中,推荐引擎通过 特征平台(FeatureStore) 的SDK读取到内存,然后传递给PAI-EAS打分服务中使用。
数据准备
准备三张基础表。
行为日志表:行为日志表是指用户在什么时间、对什么物品、做了什么行为,以及其附属字段。下面是一个最简单的用户行为日志,包含用户ID、时间、物品ID、行为事件字段:
uid_01,20240428112000,item_01,expr uid_01,20240428112005,item_01,click
其中expr、click就是行为类型(表示曝光、点击)。进一步的行为类型如加购、购买、点赞、评论等。附属字段例如:requestid、曝光位置、网络状况、操作系统、成交价格等。行为日志表每天一个分区,每个分区记录当天的行为日志。
用户表:用户信息表中用户ID不重复。要求可以和行为日志表可以通过用户唯一ID进行关联。应包含用户基础属性信息,如年龄、性别、所属城市、积分、注册时间、用户标签等。每天一个分区,记录所有用户信息。
物品表:商品信息表中商品ID不重复。要求可以和行为日志表可以通过商品唯一ID进行关联。应包含商品基础属性信息,如一级类目、二级类目、价格、标题、颜色、规格、上架时间、作者ID、粉丝数量等。同样也是每天一个分区,记录所有的物品信息。
在准备过程中对于其中特殊字符需要经过处理,比如 : ; # chr(2) chr(3) chr(29) 等符号已经被推荐模板占用,应在数据准备阶段替换掉,还有一些如不能被utf-8解码的字符,在数据准备阶段需要被处理掉。
我们在 MaxCompute 的项目空间pai_online_project中准备了3张表(rec_sln_demo_user_table,rec_sln_demo_item_table,rec_sln_demo_behavior_table),这3个表设置了公共可读权限,执行如下SQL将数据克隆到自己项目中:
-- 用户信息表 CREATE TABLE IF NOT EXISTS rec_sln_demo_user_table( user_id BIGINT COMMENT '用户唯一ID', gender STRING COMMENT '性别', age BIGINT COMMENT '年龄', city STRING COMMENT '城市', item_cnt BIGINT COMMENT '创作内容数', follow_cnt BIGINT COMMENT '累计关注数', follower_cnt BIGINT COMMENT '累计粉丝数', register_time BIGINT COMMENT '注册时间', tags STRING COMMENT '用户标签' ) PARTITIONED BY (ds STRING) STORED AS ALIORC; INSERT OVERWRITE TABLE rec_sln_demo_user_table PARTITION(ds) SELECT * FROM pai_online_project.rec_sln_demo_user_table WHERE ds > "20221231" and ds < "20230217"; -- 商品信息表 CREATE TABLE IF NOT EXISTS rec_sln_demo_item_table( item_id BIGINT COMMENT '内容ID', duration DOUBLE COMMENT '视频时长', title STRING COMMENT '标题', category STRING COMMENT '一级标签', author BIGINT COMMENT '作者', click_count BIGINT COMMENT '累计点击数', praise_count BIGINT COMMENT '累计点赞数', pub_time BIGINT COMMENT '发布时间' ) PARTITIONED BY (ds STRING) STORED AS ALIORC; INSERT OVERWRITE TABLE rec_sln_demo_item_table PARTITION(ds) SELECT * FROM pai_online_project.rec_sln_demo_item_table WHERE ds > "20221231" and ds < "20230217"; -- 日志行为表 CREATE TABLE IF NOT EXISTS rec_sln_demo_behavior_table( request_id STRING COMMENT '埋点ID/请求ID', user_id STRING COMMENT '用户唯一ID', exp_id STRING COMMENT '实验ID', page STRING COMMENT '页面', net_type STRING COMMENT '网络型号', event_time BIGINT COMMENT '行为时间', item_id STRING COMMENT '内容ID', event STRING COMMENT '行为类型', playtime DOUBLE COMMENT '播放时长/阅读时长' ) PARTITIONED BY (ds STRING) STORED AS ALIORC; INSERT OVERWRITE TABLE rec_sln_demo_behavior_table PARTITION(ds) SELECT * FROM pai_online_project.rec_sln_demo_behavior_table WHERE ds > "20221231" and ds < "20230217";