长序列用户行为特征的离线存储策略
用户行为序列示例
用户行为序列的典型结构如下所示:
【电子产品,服装,图书,家居厨具,电子产品,图书,电子产品,户外运动,电子产品】
更细粒度的交互行为可表示为:【电子产品:浏览,服装:点击,图书:购买,家居厨具:加购...】
特征分类体系
事件级特征
- 分类编码:采用独热编码或嵌入方法将事件类型(点击/加购/购买)或商品类目转换为数值
- 时序特征:从时间戳提取一天中的时段、星期几、月份及与前次交互的时间间隔
- 交互特性:商品价格、用户评分、视频观看时长等交互特有属性
序列级特征
聚合特征
- 特定事件计数:过去一周的点击/购买/搜索次数
- 数值特征均值:浏览/购买商品的平均价格
- 时间分布特征:连续交互的最大/最小/平均时间间隔
- 交互频率:每小时/每天的操作次数
会话特征
- 会话长度:事件数量或会话持续时间
- 会话行为分布:点击/购买/搜索在会话中的占比
- 会话内事件序列:用户行为链(如浏览A→查看B→加购B)
时序特征
- 滞后特征:前序交互的特性(最近浏览商品/倒数第二事件类型)
- 位置嵌入:在序列编码中添加事件顺序信息
用户级特征
- 长期偏好特征:高频交互类目TOP3、消费水平分布、日均操作次数
- 用户表征向量:基于历史行为的稠密向量表示
交互关系特征
- 用户-商品相似度:当前商品与历史交互商品的关联性计算
- 最近交互时差:特定商品的上次操作时间间隔
离线数据存储方案
- 表结构设计:见下方具体方案
- 文件格式:采用Parquet/ORC列式存储
- 分区策略:日期分区、用户ID分区
- 数据处理:批量摄取、特征增强
- 生命周期管理:数据保留策略
user_id: string
name: string
gender: string
action_sequence: array<
struct<
event_time: timestamp,
category_id: int,
event_type: string,
item_id: string,
amount: double
>
>
序列更新机制
通过合并操作实现高效更新:
MERGE INTO target_table AS tgt
USING update_source AS src
ON tgt.user_id = src.user_id
WHEN MATCHED THEN
UPDATE SET tgt.action_sequence = CONCAT_ARRAY(tgt.action_sequence, src.new_action)
WHEN NOT MATCHED THEN
INSERT (user_id, name, action_sequence)
VALUES (src.user_id, src.name, ARRAY(src.new_action))
注意:具体实现需根据存储引擎特性选择数组连接函数(如Hive的PCONCAT())
