数据仓库架构
数据仓库架构
分层架构
数据仓库采用分层设计,从ODS到DWS逐层加工,保证数据质量和可复用性。
ODS(原始层) → DWD(明细层) → DWS(汇总层) → ADS(应用层)
│ │ │ │
├─ 日志数据 ├─ 清洗转换 ├─ 聚合统计 ├─ 报表指标
├─ 业务数据 ├─ 维度关联 ├─ 主题汇总 ├─ 用户画像
└─ 外部数据 └─ 数据标准化 └─ 宽表构建 └─ 标签系统
-- DWD层:清洗明细表
CREATE TABLE dwd_order_detail (
order_id VARCHAR(32),
user_id VARCHAR(32),
product_id VARCHAR(32),
order_amount DECIMAL(10,2),
order_status INT,
order_time TIMESTAMP,
dt STRING
) PARTITIONED BY (dt);
-- DWS层:汇总统计表
CREATE TABLE dws_user_order_daily (
user_id VARCHAR(32),
order_count BIGINT,
total_amount DECIMAL(12,2),
dt STRING
) PARTITIONED BY (dt);
维度建模
星型模型以事实表为核心,通过维度表提供分析视角。
-- 事实表
CREATE TABLE fact_sales (
sale_id BIGINT PRIMARY KEY,
date_key INT,
product_key INT,
store_key INT,
customer_key INT,
quantity INT,
amount DECIMAL(12,2)
);
-- 维度表
CREATE TABLE dim_product (
product_key INT PRIMARY KEY,
product_name VARCHAR(255),
category VARCHAR(100),
brand VARCHAR(100)
);
-- 星型模型查询
SELECT p.category, SUM(f.amount) as total_sales
FROM fact_sales f
JOIN dim_product p ON f.product_key = p.product_key
JOIN dim_date d ON f.date_key = d.date_key
WHERE d.year = 2024
GROUP BY p.category;
实时数仓
基于Flink + Kafka构建实时数仓,实现秒级数据处理。
// Flink实时处理
DataStream<Order> orderStream = env
.addSource(new FlinkKafkaConsumer<>("orders", schema, properties))
.assignTimestampsAndWatermarks(WatermarkStrategy
.<Order>forBoundedOutOfOrderness(Duration.ofSeconds(5))
.withTimestampAssigner((event, timestamp) -> event.getTimestamp()));
// 实时聚合
DataStream<OrderStats> stats = orderStream
.keyBy(Order::getUserId)
.window(TumblingEventTimeWindows.of(Time.minutes(5)))
.aggregate(new OrderAggregateFunction(), new OrderWindowFunction());
离线实时一体
Lambda架构同时支持批处理和流处理,Kappa架构统一为流处理。
Lambda架构:
批处理层(Spark) ──→ 服务层 ──→ 查询层
流处理层(Flink) ──↗
Kappa架构:
流处理(Flink) ──→ 服务层 ──→ 查询层