1. 首页 > Hadoop教程 > 正文

大数据教程FG040-Hive数仓分层设计实战

内容简介:本文详细介绍Hive数据仓库分层设计的核心方法与生产实战应用。风哥教程参考Hive官方文档Data Warehouse Design、Best Practices等内容,涵盖ODS、DWD、DWS、ADS等分层架构设计原则,结合生产环境实际案例,帮助读者掌握企业级数据仓库分层设计的实战技能。

目录大纲

Part01-基础概念与理论知识
  1.1 数据仓库分层概述
  1.2 分层架构设计原则
  1.3 各层职责与关系
Part02-生产环境规划与建议
  2.1 分层命名规范
  2.2 数据流转设计
  2.3 元数据管理策略
Part03-生产环境项目实施方案
  3.1 ODS层设计与实现
  3.2 DWD层设计与实现
  3.3 DWS层设计与实现
Part04-生产案例与实战讲解
  4.1 电商数仓分层案例
  4.2 用户画像分层案例
  4.3 报表系统分层案例
Part05-风哥经验总结与分享
  5.1 分层设计最佳实践
  5.2 常见问题与解决方案
  5.3 生产环境注意事项

Part01-基础概念与理论知识

1.1 数据仓库分层概述

数据仓库分层是构建企业级数据平台的核心设计理念,通过合理的分层架构实现数据的高效管理和价值挖掘。更多视频教程www.fgedu.net.cn

分层架构的价值:

1. 简化数据开发流程,降低开发复杂度
2. 提高数据复用性,减少重复计算
3. 保障数据质量,建立统一数据标准
4. 便于数据治理,实现数据血缘追踪

标准四层架构:

ODS层(Operational Data Store):操作数据层,存储原始数据。学习交流加群风哥微信: itpux-com

DWD层(Data Warehouse Detail):明细数据层,存储清洗后的明细数据。

DWS层(Data Warehouse Summary):汇总数据层,存储聚合汇总数据。

ADS层(Application Data Store):应用数据层,存储面向应用的数据。

1.2 分层架构设计原则

数据仓库分层设计需要遵循以下原则:

单一职责原则:每层只负责特定的数据处理任务,避免职责混乱。

数据不可变原则:下层依赖上层,数据只能向下流转,不可逆向更新。

最小粒度原则:ODS层保持原始粒度,DWD层保持业务粒度,DWS层保持分析粒度。

复用优先原则:优先复用已有数据层,避免重复建设。

1.3 各层职责与关系

各层职责清晰,数据流转有序:

数据流向:

源系统数据
    ↓
ODS层(原始数据层)
  ├── 保持原始数据结构
  ├── 按天分区存储
  └── 数据备份与恢复
    ↓
DWD层(明细数据层)
  ├── 数据清洗与转换
  ├── 统一字段命名
  └── 维度退化处理
    ↓
DWS层(汇总数据层)
  ├── 按主题汇总
  ├── 多维度聚合
  └── 指标计算
    ↓
ADS层(应用数据层)
  ├── 面向业务应用
  ├── 报表数据
  └── 接口数据

Part02-生产环境规划与建议

2.1 分层命名规范

统一的命名规范是数据仓库管理的基础。风哥提示:良好的命名规范可以大幅提高数据开发效率。

— 数据库命名规范
ODS层: ods_业务域
DWD层: dwd_业务域
DWS层: dws_业务域
ADS层: ads_业务域
DIM层: dim_业务域

— 表命名规范
格式: 层级_业务域_主题_粒度
示例: dwd_trade_order_di
  ├── dwd: 明细层
  ├── trade: 交易域
  ├── order: 订单主题
  └── di: 日增量

— 粒度后缀说明
di: 日增量(Daily Increment)
df: 日全量(Daily Full)
mi: 月增量(Monthly Increment)
mf: 月全量(Monthly Full)

2.2 数据流转设计

数据流转需要设计合理的调度依赖关系:更多学习教程公众号风哥教程itpux_com

— 调度依赖关系
ODS层 → DWD层 → DWS层 → ADS层

— 各层调度时间建议
ODS层: T+1 凌晨2点前完成
DWD层: T+1 凌晨4点前完成
DWS层: T+1 凌晨6点前完成
ADS层: T+1 早上8点前完成

— 数据质量检查点
ODS层: 数据完整性检查
DWD层: 数据一致性检查
DWS层: 指标准确性检查
ADS层: 结果验证检查

2.3 元数据管理策略

元数据管理是数据仓库的重要组成部分:

— 创建元数据管理表
CREATE TABLE fgedu_meta_table_info (
  table_id BIGINT,
  database_name STRING,
  table_name STRING,
  layer_type STRING,
  business_domain STRING,
  table_comment STRING,
  owner STRING,
  create_time TIMESTAMP,
  update_time TIMESTAMP
) STORED AS ORC;

— 创建字段元数据表
CREATE TABLE fgedu_meta_column_info (
  table_id BIGINT,
  column_name STRING,
  column_type STRING,
  column_comment STRING,
  is_primary_key BOOLEAN,
  create_time TIMESTAMP
) STORED AS ORC;

Part03-生产环境项目实施方案

3.1 ODS层设计与实现

ODS层是数据仓库的入口层,负责存储原始数据。from bigdata视频:www.itpux.com

3.1.1 ODS层设计原则

— ODS层设计要点
— 1. 保持原始数据结构,不做业务处理
— 2. 按天分区,便于增量同步
— 3. 使用压缩存储,节省空间
— 4. 保留历史数据,支持数据回溯

— 创建ODS层订单表
CREATE DATABASE IF NOT EXISTS ods_trade;

CREATE TABLE ods_trade.ods_trade_order_di (
  order_id STRING COMMENT ‘订单ID’,
  user_id STRING COMMENT ‘用户ID’,
  product_id STRING COMMENT ‘商品ID’,
  order_amount DECIMAL(12,2) COMMENT ‘订单金额’,
  order_status STRING COMMENT ‘订单状态’,
  create_time STRING COMMENT ‘创建时间’,
  update_time STRING COMMENT ‘更新时间’,
  etl_time TIMESTAMP COMMENT ‘ETL时间’
) PARTITIONED BY (dt STRING)
STORED AS ORC
TBLPROPERTIES (
  ‘orc.compress’=’SNAPPY’,
  ‘comment’=’订单原始数据表’
);

# 创建ODS层成功
OK
Time taken: 0.234 seconds

# 数据库列表
ods_trade
dwd_trade
dws_trade
ads_trade

3.1.2 ODS层数据同步

— 使用Sqoop同步MySQL数据到ODS层
sqoop import \
  –connect jdbc:mysql://fgedu01:3306/trade_db \
  –username fgedu \
  –password fgedu123 \
  –table orders \
  –target-dir /user/hive/warehouse/ods_trade.db/ods_trade_order_di/dt=2024-01-19 \
  –delete-target-dir \
  –fields-terminated-by ‘\t’ \
  –compress \
  –compression-codec org.apache.hadoop.io.compress.SnappyCodec;

— 修复分区
MSCK REPAIR TABLE ods_trade.ods_trade_order_di;

# Sqoop导入成功
24/01/19 02:00:00 INFO sqoop.ImportTool: Transfer complete: 1250000 records.
24/01/19 02:00:00 INFO sqoop.ImportTool: Retrieved 1250000 records.

# 分区修复
OK
Partitions: dt=2024-01-19
Time taken: 1.234 seconds

3.2 DWD层设计与实现

DWD层是数据仓库的核心层,负责数据清洗和转换。学习交流加群风哥QQ113257174

3.2.1 DWD层设计原则

— DWD层设计要点
— 1. 数据清洗:去重、空值处理、异常值处理
— 2. 数据转换:字段类型统一、编码统一
— 3. 维度退化:将常用维度字段冗余到事实表
— 4. 建立维度表:独立维护维度数据

— 创建DWD层订单明细表
CREATE DATABASE IF NOT EXISTS dwd_trade;

CREATE TABLE dwd_trade.dwd_trade_order_di (
  order_id STRING COMMENT ‘订单ID’,
  user_id STRING COMMENT ‘用户ID’,
  user_name STRING COMMENT ‘用户名称’,
  user_level STRING COMMENT ‘用户等级’,
  product_id STRING COMMENT ‘商品ID’,
  product_name STRING COMMENT ‘商品名称’,
  category_id STRING COMMENT ‘类目ID’,
  category_name STRING COMMENT ‘类目名称’,
  order_amount DECIMAL(12,2) COMMENT ‘订单金额’,
  order_status STRING COMMENT ‘订单状态’,
  payment_amount DECIMAL(12,2) COMMENT ‘支付金额’,
  payment_time TIMESTAMP COMMENT ‘支付时间’,
  create_time TIMESTAMP COMMENT ‘创建时间’,
  etl_time TIMESTAMP COMMENT ‘ETL时间’
) PARTITIONED BY (dt STRING)
STORED AS ORC
TBLPROPERTIES (‘orc.compress’=’SNAPPY’);

3.2.2 DWD层ETL开发

— DWD层ETL脚本
INSERT OVERWRITE TABLE dwd_trade.dwd_trade_order_di PARTITION(dt)
SELECT
  o.order_id,
  o.user_id,
  u.user_name,
  u.user_level,
  o.product_id,
  p.product_name,
  p.category_id,
  c.category_name,
  o.order_amount,
  o.order_status,
  pay.payment_amount,
  pay.payment_time,
  FROM_UNIXTIME(UNIX_TIMESTAMP(o.create_time, ‘yyyy-MM-dd HH:mm:ss’)) AS create_time,
  CURRENT_TIMESTAMP AS etl_time,
  dt
FROM ods_trade.ods_trade_order_di o
LEFT JOIN dim_trade.dim_user_df u ON o.user_id = u.user_id
LEFT JOIN dim_trade.dim_product_df p ON o.product_id = p.product_id
LEFT JOIN dim_trade.dim_category_df c ON p.category_id = c.category_id
LEFT JOIN ods_trade.ods_trade_payment_di pay ON o.order_id = pay.order_id
WHERE o.dt = ‘${dt}’;

# ETL执行成功
Query ID = root_20240119040000_xxxx
Total jobs = 1

Loading data to table dwd_trade.dwd_trade_order_di
Table dwd_trade.dwd_trade_order_di stats: [numFiles=1, numRows=1250000, totalSize=45678901]
OK
Time taken: 234.567 seconds

3.3 DWS层设计与实现

DWS层负责数据汇总和指标计算。

3.3.1 DWS层设计原则

— DWS层设计要点
— 1. 按主题域划分:用户域、商品域、交易域等
— 2. 多维度汇总:支持多维度分析需求
— 3. 指标标准化:统一指标计算口径
— 4. 轻度汇总:保持一定的灵活性

— 创建DWS层用户交易汇总表
CREATE DATABASE IF NOT EXISTS dws_trade;

CREATE TABLE dws_trade.dws_trade_user_order_1d (
  user_id STRING COMMENT ‘用户ID’,
  user_name STRING COMMENT ‘用户名称’,
  user_level STRING COMMENT ‘用户等级’,
  order_count BIGINT COMMENT ‘订单数’,
  order_amount DECIMAL(14,2) COMMENT ‘订单金额’,
  payment_amount DECIMAL(14,2) COMMENT ‘支付金额’,
  first_order_time TIMESTAMP COMMENT ‘首单时间’,
  last_order_time TIMESTAMP COMMENT ‘末单时间’,
  etl_time TIMESTAMP COMMENT ‘ETL时间’
) PARTITIONED BY (dt STRING)
STORED AS ORC
TBLPROPERTIES (‘orc.compress’=’SNAPPY’);

3.3.2 DWS层汇总开发

— DWS层汇总脚本
INSERT OVERWRITE TABLE dws_trade.dws_trade_user_order_1d PARTITION(dt)
SELECT
  user_id,
  user_name,
  user_level,
  COUNT(*) AS order_count,
  SUM(order_amount) AS order_amount,
  SUM(payment_amount) AS payment_amount,
  MIN(create_time) AS first_order_time,
  MAX(create_time) AS last_order_time,
  CURRENT_TIMESTAMP AS etl_time,
  dt
FROM dwd_trade.dwd_trade_order_di
WHERE dt = ‘${dt}’
GROUP BY user_id, user_name, user_level, dt;

Part04-生产案例与实战讲解

4.1 电商数仓分层案例

本案例演示电商数仓的完整分层设计。更多视频教程www.fgedu.net.cn

#!/bin/bash
# ecommerce_dw_build.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: http://www.fgedu.net.cn

echo “=== 电商数仓分层构建 ===”
echo “Date: $(date)”

DT=$1
if [ -z “$DT” ]; then
  DT=$(date -d “-1 day” +%Y-%m-%d)
fi

echo “Processing date: $DT”

# ODS层数据同步
echo “Step 1: ODS Layer Data Sync”
hive -e “
— 同步订单数据
INSERT OVERWRITE TABLE ods_trade.ods_trade_order_di PARTITION(dt=’$DT’)
SELECT * FROM source_orders WHERE dt = ‘$DT’;

— 同步用户数据
INSERT OVERWRITE TABLE ods_trade.ods_trade_user_df PARTITION(dt=’$DT’)
SELECT * FROM source_users;

# DWD层数据处理
echo “Step 2: DWD Layer Data Processing”
hive -e “
INSERT OVERWRITE TABLE dwd_trade.dwd_trade_order_di PARTITION(dt=’$DT’)
SELECT
  o.order_id, o.user_id, u.user_name, u.user_level,
  o.product_id, p.product_name, p.category_id, c.category_name,
  o.order_amount, o.order_status, pay.payment_amount, pay.payment_time,
  o.create_time, CURRENT_TIMESTAMP, ‘$DT’
FROM ods_trade.ods_trade_order_di o
LEFT JOIN dim_trade.dim_user_df u ON o.user_id = u.user_id
LEFT JOIN dim_trade.dim_product_df p ON o.product_id = p.product_id
LEFT JOIN dim_trade.dim_category_df c ON p.category_id = c.category_id
LEFT JOIN ods_trade.ods_trade_payment_di pay ON o.order_id = pay.order_id AND pay.dt = ‘$DT’
WHERE o.dt = ‘$DT’;

# DWS层数据汇总
echo “Step 3: DWS Layer Data Aggregation”
hive -e “
INSERT OVERWRITE TABLE dws_trade.dws_trade_user_order_1d PARTITION(dt=’$DT’)
SELECT
  user_id, user_name, user_level,
  COUNT(*) AS order_count,
  SUM(order_amount) AS order_amount,
  SUM(payment_amount) AS payment_amount,
  MIN(create_time) AS first_order_time,
  MAX(create_time) AS last_order_time,
  CURRENT_TIMESTAMP, ‘$DT’
FROM dwd_trade.dwd_trade_order_di
WHERE dt = ‘$DT’
GROUP BY user_id, user_name, user_level;

echo “=== 构建完成 ===”

=== 电商数仓分层构建 ===
Date: Fri Jan 19 06:00:00 CST 2024
Processing date: 2024-01-18

Step 1: ODS Layer Data Sync
Query ID = root_20240119060000_xxxx
OK
Time taken: 45.678 seconds

Step 2: DWD Layer Data Processing
Query ID = root_20240119060100_xxxx
OK
Time taken: 123.456 seconds

Step 3: DWS Layer Data Aggregation
Query ID = root_20240119060300_xxxx
OK
Time taken: 67.890 seconds

=== 构建完成 ===

4.2 用户画像分层案例

用户画像分层案例演示用户标签体系构建。学习交流加群风哥微信: itpux-com

— 用户画像分层设计

— ODS层:用户行为日志
CREATE TABLE ods_user.ods_user_behavior_log_di (
  user_id STRING,
  event_type STRING,
  event_time TIMESTAMP,
  page_id STRING,
  product_id STRING
) PARTITIONED BY (dt STRING)
STORED AS ORC;

— DWD层:用户行为明细
CREATE TABLE dwd_user.dwd_user_behavior_detail_di (
  user_id STRING,
  event_date DATE,
  event_type STRING,
  event_count BIGINT,
  stay_time BIGINT
) PARTITIONED BY (dt STRING)
STORED AS ORC;

— DWS层:用户标签汇总
CREATE TABLE dws_user.dws_user_profile_1d (
  user_id STRING,
  active_days_7d INT,
  active_days_30d INT,
  total_orders BIGINT,
  total_amount DECIMAL(14,2),
  user_level STRING,
  user_tag STRING
) PARTITIONED BY (dt STRING)
STORED AS ORC;

4.3 报表系统分层案例

报表系统分层案例演示报表数据层设计。风哥提示:报表层要考虑查询性能和数据时效性。

— ADS层:日报表
CREATE TABLE ads_trade.ads_trade_daily_report (
  report_date DATE,
  total_orders BIGINT,
  total_amount DECIMAL(16,2),
  total_users BIGINT,
  new_users BIGINT,
  avg_order_amount DECIMAL(12,2),
  conversion_rate DECIMAL(5,4)
) STORED AS ORC;

— 生成日报表
INSERT OVERWRITE TABLE ads_trade.ads_trade_daily_report
SELECT
  DATE(‘$DT’) AS report_date,
  SUM(order_count) AS total_orders,
  SUM(order_amount) AS total_amount,
  COUNT(DISTINCT user_id) AS total_users,
  SUM(CASE WHEN first_order_date = DATE(‘$DT’) THEN 1 ELSE 0 END) AS new_users,
  ROUND(SUM(order_amount) / SUM(order_count), 2) AS avg_order_amount,
  ROUND(SUM(payment_amount) / SUM(order_amount), 4) AS conversion_rate
FROM dws_trade.dws_trade_user_order_1d
WHERE dt = ‘$DT’;

Part05-风哥经验总结与分享

5.1 分层设计最佳实践

风哥在生产环境中的分层设计经验总结:from bigdata视频:www.itpux.com

1. 分层原则:

ODS层保持原始,DWD层统一标准,DWS层服务分析,ADS层面向应用

2. 命名规范:

统一命名规范,便于理解和管理

3. 数据质量:

每层设置数据质量检查点,确保数据准确性

4. 性能优化:

合理选择存储格式和压缩算法,优化查询性能

5.2 常见问题与解决方案

问题1:数据倾斜

解决方案:合理设计分区和分桶,处理热点数据。

— 检查数据倾斜
SELECT dt, COUNT(*) AS cnt
FROM dwd_trade.dwd_trade_order_di
GROUP BY dt
ORDER BY cnt DESC;

问题2:数据延迟

解决方案:优化ETL流程,增加并行度,使用增量处理。学习交流加群风哥QQ113257174

5.3 生产环境注意事项

1. 数据安全:敏感数据脱敏,权限控制。

2. 数据备份:定期备份关键数据,建立恢复机制。

3. 监控告警:建立完善的监控体系,及时发现和处理问题。

— 数据质量检查脚本
SELECT
  ‘dwd_trade_order_di’ AS table_name,
  COUNT(*) AS total_rows,
  COUNT(DISTINCT user_id) AS distinct_users,
  SUM(CASE WHEN order_amount IS NULL THEN 1 ELSE 0 END) AS null_amount_count
FROM dwd_trade.dwd_trade_order_di
WHERE dt = ‘$DT’;

风哥提示:数据仓库分层设计是构建企业级数据平台的基础,合理的分层架构可以大幅提高数据开发效率和数据质量。在生产环境中,要严格遵循分层原则,建立完善的命名规范和数据质量检查机制,确保数据仓库的稳定运行。

本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html

联系我们

在线咨询:点击这里给我发消息

微信号:itpux-com

工作日:9:30-18:30,节假日休息