
1) 【一句话结论】
针对TB级用户行为数据,采用“实时列式宽表(时间分区+用户ID哈希分片)+离线时间分区列式表”混合架构,通过列级压缩与索引优化支持秒级实时查询和大数据量离线分析,统一分区策略保障数据一致性。
2) 【原理/概念讲解】
event_time天分区,查询当天数据时仅扫描对应分区,大幅减少数据量(类比:按“日期”分类货架,查询当天数据仅看该日期货架)。user_id哈希分片,避免单个分片数据过多导致倾斜(类比:将用户分到不同“储物柜”,每个储物柜容量均衡)。user_id + event_time):保证唯一性并快速定位单条记录。event_type、action_source):加速复杂查询(如按“点击类型”筛选)。3) 【对比与适用场景】
| 存储方案 | 数据模型 | 适合场景 | 关键特性 | 注意点 |
|---|---|---|---|---|
| 实时列式宽表(Doris) | 行式+列扩展+时间分区 | 实时查询(秒级响应) | 高并发写入、列级压缩、复杂查询支持 | 需按用户ID哈希分片,避免倾斜 |
| 离线时间分区表(Hive/Doris) | 列式+时间分区 | 离线分析(小时级以上) | 大数据量扫描、SQL分析、按分区加载 | 分区粒度需平衡(过细分区多,过粗扫描量大) |
4) 【示例】(以Doris宽表和Hive分区表为例):
CREATE TABLE user_behavior_realtime (
user_id BIGINT NOT NULL,
event_time TIMESTAMP NOT NULL,
event_type VARCHAR(20), -- click, watch, interact
item_id BIGINT,
duration_seconds BIGINT,
action_source VARCHAR(50), -- 移动端/PC
PRIMARY KEY (user_id, event_time)
) PARTITION BY DAY (event_time)
SHARD BY HASH (user_id); -- 用户ID哈希分片,水平扩展
CREATE TABLE user_behavior_offline (
user_id BIGINT,
event_time TIMESTAMP,
event_type VARCHAR(20),
item_id BIGINT,
duration_seconds BIGINT,
action_source VARCHAR(50),
PARTITION BY DATE(event_time) -- 按天反序分区(最近数据在前)
) STORED AS ORC;
5) 【面试口播版答案】
面试官您好,针对TB级用户行为数据,我设计的方案是“实时列式宽表+离线时间分区表”混合架构。实时查询用列式宽表(如Doris),表按user_id + event_time主键,按天分区,列存储事件属性(点击、时长等),通过列级压缩和主键索引实现秒级响应(如查询某用户某天行为)。离线分析用Hive的分区表,按天反序分区存储历史数据,支持SQL分析(如用户行为画像)。索引方面,实时表有主键和辅助索引(如event_type),离线表有分区索引和主键索引,保障一致性。通过统一时间分区策略,既支持实时监控(如用户行为实时统计),也支持离线分析(如用户行为趋势分析)。
6) 【追问清单】
action_source索引),使用物化视图加速复杂查询。7) 【常见坑/雷区】