剑指数据仓库-项目篇(三) - 数据建模的三种模型&&ods层到dwd层介绍

本文详细介绍了数据仓库的建模过程,包括星型模型、雪花模型和星座模型的讲解,以及ODS层到DWD层的数据转换。讨论了在业务场景中补加updatetime字段的重要性,强调了数据建模在ERP项目架构中的作用,同时阐述了数仓分层流程和ODS到DWD层的具体操作,如MySQL到Hive的表结构转换和数据同步问题。
<think>我们正在处理一个关于Hive项目中如何从ODS数据DWD的问题。根据提供的引用,我们可以总结出以下关键点: 1. **引用[1]**:提到了项目目标是自动化构建ODSDWD,并掌握Hive和Spark的建表语法规则。 2. **引用[2]**:讨论了在数仓建模中,从ODSDWD通常使用维度模型(星型模型或雪花模型)来减少多表关联,提高查询效率。 3. **引用[3]**:描述了一个在从ODS加载数据DWD时可能遇到的异常情况,即由于外部表的数据文件残留导致插入失败的问题。 4. **引用[4]**:展示了一个具体的SQL插入语句示例,将数据ODS导入到DWD的分区表中。 基于以上信息,我们可以总结出从ODS数据DWD的一般步骤: ### 步骤一:创建DWD表 首先,需要在DWD创建表。根据维度模型设计表结构,通常包括事实表和维度表。在Hive中,可以使用以下语句创建表(以外部表为例,便于管理数据): ```sql CREATE EXTERNAL TABLE IF NOT EXISTS dwd_table_name ( column1 data_type, column2 data_type, ... ) PARTITIONED BY (dt string) -- 通常按天分区 STORED AS PARQUET -- 推荐使用列式存储格式,如Parquet LOCATION '/warehouse/dwd/db_name/dwd_table_name'; ``` ### 步骤二:数据清洗与转换 从ODS抽取数据,并进行清洗和转换,以满足DWD数据质量要求和模型设计。这包括: - 过滤掉无效数据(如空值、非法值等) - 数据格式转换(如时间戳转换、字段类型转换) - 维度退化(将一些维度信息直接加入到事实表中,减少关联) - 业务字段的重新计算或组合 ### 步骤:将数据插入DWD 使用Hive的`INSERT`语句将处理后的数据加载到DWD表中。通常我们会按天进行分区存储,例如: ```sql INSERT OVERWRITE TABLE dwd_table_name PARTITION (dt='${date}') SELECT column1, column2, ... FROM ods_table_name WHERE dt='${date}' -- 这里可以添加各种数据转换和清洗操作 ``` ### 注意事项: 1. **外部表管理**:如引用[3]所述,删除外部表时只删除元数据,不删除数据文件。因此,在重新创建表时,如果HDFS上已有数据文件,可能会导致插入失败。解决办法是:在插入数据前,确保目标目录是空的(可以通过`ALTER TABLE ... DROP PARTITION`删除旧分区,或者直接删除HDFS上的文件)。 2. **数据去重**:在ODS数据可能存在重复的情况下,需要在导入DWD时进行去重操作。 3. **性能优化**:使用分区和分桶可以提高查询效率。同时,使用列式存储格式(如Parquet)可以节省存储空间并提高查询性能。 ### 示例代码 假设我们有一个ODS的用户行为日志表`ods_user_action_log`,现在要将其导入到DWD的`dwd_user_action_log`表中,并按照日期分区。 ```sql -- 创建DWD表 CREATE EXTERNAL TABLE IF NOT EXISTS dwd_user_action_log ( user_id BIGINT, item_id BIGINT, action_type STRING, action_time TIMESTAMP, province STRING, city STRING ) PARTITIONED BY (dt STRING) STORED AS PARQUET LOCATION '/warehouse/dwd/db_name/dwd_user_action_log'; -- 导入数据(假设处理当天的数据) INSERT OVERWRITE TABLE dwd_user_action_log PARTITION (dt='${date}') SELECT user_id, item_id, action_type, FROM_UNIXTIME(CAST(`timestamp` AS BIGINT), 'yyyy-MM-dd HH:mm:ss') AS action_time, province, city FROM ods_user_action_log WHERE dt='${date}' AND user_id IS NOT NULL -- 过滤无效数据 AND action_type IN ('click', 'buy', 'cart'); -- 只保留有效的行为类型 ``` 在这个例子中,我们进行了以下处理: - 将时间戳字段转换为标准的TIMESTAMP格式。 - 过滤了无效的用户ID和不在指定行为类型范围内的数据- 按天分区存储。 ### 自动化脚本 在实际项目中,通常会编写自动化脚本(如Shell脚本)来循环执行每天的导入任务,并传入日期参数。 综上所述,从ODS数据DWD主要包括建表、数据清洗转换和插入数据个步骤,同时需要注意数据质量控制和性能优化。 §§相关问题§§ 1. Hive中如何管理外部表的数据文件? 2. 在数据清洗过程中,Hive SQL常用的数据转换函数有哪些? 3. 如何优化Hive查询以提高从ODSDWD数据导入效率? 4. 在数仓项目中,DWD数据模型设计有哪些常见模式?</think>### Hive项目ODS数据DWD的方法 在Hive数仓项目中,从ODS(操作数据存储)到DWD数据仓库明细)的数据导入通常通过以下步骤实现: #### 1. **创建DWD表结构** ```sql CREATE EXTERNAL TABLE IF NOT EXISTS dwd_table_name ( column1 data_type, column2 data_type, ... ) PARTITIONED BY (dt string) -- 按天分区 STORED AS PARQUET -- 推荐列式存储格式 LOCATION '/warehouse/dwd/db_name/dwd_table_name'; ``` **关键点**: - 使用`EXTERNAL TABLE`防止误删数据文件[^3] - 分区字段通常为日期`dt` - 存储格式推荐Parquet/ORC以提高查询性能[^2] #### 2. **数据清洗与转换** ```sql INSERT OVERWRITE TABLE dwd_table_name PARTITION (dt='${date}') SELECT CAST(raw_column AS target_type) AS new_column, -- 类型转换 COALESCE(null_column, 0) AS default_value, -- 空值处理 REGEXP_EXTRACT(log, 'pattern') AS extracted_field, -- 字段提取 GET_JSON_OBJECT(json_col, '$.key') AS json_value -- JSON解析 FROM ods_table_name WHERE dt='${date}' AND is_valid = 1; -- 过滤无效数据 ``` **核心操作**: - 字段格式标准化(时间戳转换、字符编码统一) -数据过滤(如空值、异常值) - 业务字段解析(日志拆分、JSON/XML解析)[^1][^2] - 维度退化(减少后续关联查询) #### 3. **自动化脚本示例 ```shell #!/bin/bash date=$1 SQL="INSERT OVERWRITE TABLE dwd_table PARTITION(dt='${date}') SELECT col1, col2 FROM ods_table WHERE dt='${date}'" hive -e "${SQL}" # 执行HQL命令 ``` **自动化要点**: - 通过调度工具(如Azkaban/Airflow)每日调度 - 使用`${date}`变量实现分区动态注入[^4] - 添加错误重试机制 #### 4. **常见问题解决** - **问题1**:HDFS文件冲突 **方案**:先清空目标分区目录 ```shell hdfs dfs -rm -r /warehouse/dwd/db/table/dt=${date} ``` - **问题2**:数据类型转换异常 **方案**:使用`CAST()`或`CASE WHEN`处理异常值 - **问题3**:数据倾斜 **方案**:添加`DISTRIBUTE BY RAND()`分散处理[^3] #### 5. **最佳实践** 1. **数据验证**:执行后检查行数波动和NULL值比例 2. **性能优化**: - 启用Tez/Spark引擎 - 设置合并小文件参数 `SET hive.merge.mapfiles=true;` 3. **数据质量**:添加字段长度校验、枚举值检查等约束 > 完整流程示例: > ODS日志 → 解析JSON字段 → 清洗非法字符 → 转换时间戳 → 关联维度 → 写入DWD分区表[^1][^2]
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值