为什么hive在处理数据时,有的累加是半累加数据
在 Hive 处理数据时,“半累加数据” 指的是部分字段保留历史状态、部分字段随业务变化累加或更新的场景,这种模式广泛存在于需要兼顾 “历史追溯” 和 “增量更新” 的业务中。以下是具体例子,帮助理解其本质:
例子 1:用户行为维度表(SCD2 模型)
业务场景:用户信息表中,部分属性(如注册时间)一旦生成就固定不变,部分属性(如用户等级、积分)需要随行为累加或更新,同时需要保留历史状态。
数据变化过程:
初始数据(2023-01-01):
用户 ID 注册时间 等级 积分 生效时间 失效时间 1001 2023-01-01 Lv1 0 2023-01-01 9999-12-31 2023-02-01 用户积分增加到 100,等级升级为 Lv2:
不修改原记录,而是新增一条记录(保留历史版本):用户 ID 注册时间 等级 积分 生效时间 失效时间 1001 2023-01-01 Lv1 0 2023-01-01 2023-01-31 (历史版本) 1001 2023-01-01 Lv2 100 2023-02-01 9999-12-31 (当前版本)
半累加特征:
- 静态字段(注册时间):永远不变,不参与累加。
- 动态字段(等级、积分):随业务更新,新记录覆盖旧状态,但通过 “生效 / 失效时间” 保留历史。
- 整体数据量:随变更累加(新增记录),但单条记录不被覆盖。
例子 2:订单状态流水表
业务场景:订单创建后,金额、商品等信息固定,但支付状态、退款次数等需要随流程更新,同时需要记录状态变更轨迹。
数据变化过程:
订单创建(2023-03-01 10:00):
订单 ID 金额 商品 支付状态 退款次数 记录时间 O2001 200 衬衫 未支付 0 2023-03-01 10:00 2023-03-01 10:30 支付成功:
新增一条状态记录(不修改原记录):订单 ID 金额 商品 支付状态 退款次数 记录时间 O2001 200 衬衫 未支付 0 2023-03-01 10:00 O2001 200 衬衫 已支付 0 2023-03-01 10:30 2023-03-02 09:00 申请退款:
再新增一条记录:订单 ID 金额 商品 支付状态 退款次数 记录时间 O2001 200 衬衫 未支付 0 2023-03-01 10:00 O2001 200 衬衫 已支付 0 2023-03-01 10:30 O2001 200 衬衫 已退款 1 2023-03-02 09:00
半累加特征:
- 静态字段(金额、商品):创建后固定,不参与累加。
- 动态字段(支付状态、退款次数):随流程更新,每次变更生成新记录。
- 整体数据:按状态变更累加,可追溯完整流程,但不会覆盖历史状态。
例子 3:每日活跃用户增量表
业务场景:按天统计活跃用户,每天的活跃用户是增量数据,但用户的基础信息(如注册渠道)固定。
数据存储方式:
- 按天分区(
dt='2023-05-01'
、dt='2023-05-02'
等)。 - 每个分区存储当天活跃用户的信息,包含固定字段和动态字段。
数据示例:
dt='2023-05-01'
分区:用户 ID 注册渠道 当日活跃时长(分钟) 1001 官网 30 1002 应用商店 45 dt='2023-05-02'
分区(新增当日活跃用户):用户 ID 注册渠道 当日活跃时长(分钟) 1001 官网 20 (1001 用户再次活跃) 1003 小程序 15 (新活跃用户)
半累加特征:
- 静态字段(注册渠道):每个用户只记录一次(或重复但值不变),不随日期累加。
- 动态字段(当日活跃时长):按日增量记录,累计计算总时长时需汇总各分区。
- 整体数据:按日期分区累加,每个分区是独立的增量,不覆盖历史分区。
总结
半累加数据的核心是 **“区分静态与动态字段,保留历史同时支持增量更新”**,这既满足了数据仓库 “可追溯” 的需求,也适配了 Hive 基于 HDFS“擅长追加、不擅长修改” 的技术特性。常见于维度表(SCD2)、状态流水表、按时间分区的增量统计场景中。