数据准备

背景介绍

在推荐系统的粗排和精排系统中,一般都需要在用户侧和物品侧设计大量的统计特征、序列特征、组合特征;基于统计特征还可以设计lookupmatch特征等衍生特征。例如一个用户侧的偏好类目统计特征f1(KV类型特征),需要经历离线统计、组合为Lookup特征供离线训练;在线推理的时候需要把f1同步到在线系统中,推荐引擎通过 特征平台(FeatureStore)SDK读取到内存,然后传递给PAI-EAS打分服务中使用。

数据准备

  1. 准备三张基础表。

    • 行为日志表:行为日志表是指用户在什么时间、对什么物品、做了什么行为,以及其附属字段。下面是一个最简单的用户行为日志,包含用户ID、时间、物品ID、行为事件字段:

      uid_01,20240428112000,item_01,expr
      uid_01,20240428112005,item_01,click

      其中expr、click就是行为类型(表示曝光、点击)。进一步的行为类型如加购、购买、点赞、评论等。附属字段例如:requestid、曝光位置、网络状况、操作系统、成交价格等。行为日志表每天一个分区,每个分区记录当天的行为日志。

    • 用户表:用户信息表中用户ID不重复。要求可以和行为日志表可以通过用户唯一ID进行关联。应包含用户基础属性信息,如年龄、性别、所属城市、积分、注册时间、用户标签等。每天一个分区,记录所有用户信息。

    • 物品表:商品信息表中商品ID不重复。要求可以和行为日志表可以通过商品唯一ID进行关联。应包含商品基础属性信息,如一级类目、二级类目、价格、标题、颜色、规格、上架时间、作者ID、粉丝数量等。同样也是每天一个分区,记录所有的物品信息。

  2. 在准备过程中对于其中特殊字符需要经过处理,比如 : ; # chr(2) chr(3) chr(29) 等符号已经被推荐模板占用,应在数据准备阶段替换掉,还有一些如不能被utf-8解码的字符,在数据准备阶段需要被处理掉。

  3. 我们在 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";