← 返回首页
🗄️

数据仓库架构

📂 architecture ⏱ 1 min 192 words

数据仓库架构

分层架构

数据仓库采用分层设计,从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) ──→ 服务层 ──→ 查询层