内容简介:本文详细介绍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层设计原则
— 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’=’订单原始数据表’
);
OK
Time taken: 0.234 seconds
# 数据库列表
ods_trade
dwd_trade
dws_trade
ads_trade
3.1.2 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;
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层设计原则
— 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开发
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}’;
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层设计原则
— 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层汇总开发
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
# 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 报表系统分层案例
报表系统分层案例演示报表数据层设计。风哥提示:报表层要考虑查询性能和数据时效性。
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
