数据仓库——ODS/stg层数据漂移问题

数据漂移是ODS层常见的问题,表现为同一业务日期数据混入前后天数据或丢失当日更新。处理方法包括多获取后一天数据及利用时间戳字段精确限制时间。

数据仓库——ODS/stg层数据漂移问题

数据漂移是ODS数据的一个顽疾,通常是指ODS表的同一个业务日期数据中包含前一天或后一天凌晨附近的数据或者丢失当天变更数据。

数据漂移的处理方式
1)多获取后一天的数据
2)通过多个时间戳字段限制时间来获取相对准确的数据。

<think>我们正在模拟三数据仓库架构:ODS(操作数据存储)、DW数据仓库,可能包括DWD明细和DWS汇总)、DM数据集市)。需要创建三账号,并模拟数据在这些之间的流转。 根据引用[1]和[2],我们可以了解到: - ODS存储原始数据,接近源系统。 - DW(可能包含DWD和DWS)进行数据整合、清洗和汇总。 - DM是为特定业务需求构建的数据集市,通常从DW加工而来。 我们需要创建三账号,并模拟数据ODS->DW->DM的流转。 步骤: 1. 创建三个账号(或三个数据库)分别代ODS、DW、DM。 2. 在ODS创建,模拟源数据。 3. 在DW创建,从ODS抽取、转换、加载数据(ETL)。 4. 在DM创建,从DW汇总数据,面向业务分析。 模拟示例: 假设我们有一个简单的业务:记录国家、城市、人口(参考引用[4]的结构)。 具体步骤: 1. 创建三账号(或三个数据库): - 创建ods_account,拥有ODS数据库的权限。 - 创建dw_account,拥有DW数据库的权限。 - 创建dm_account,拥有DM数据库的权限。 2. 在ODSods_db)中创建country_city_people,并插入模拟数据(模拟源系统数据): ```sql CREATE DATABASE IF NOT EXISTS ods_db; CREATE TABLE ods_db.country_city_people ( country VARCHAR(255), city VARCHAR(255), people INT ); INSERT INTO ods_db.country_city_people VALUES ('China', 'Beijing', 21540000), ('China', 'Shanghai', 24240000), ('USA', 'New York', 8419000); ``` 3. 在DW(dw_db)中创建,这里我们假设DW需要存储清洗后的数据,并增加一个区域字段(例如,将国家归类到洲): ```sql CREATE DATABASE IF NOT EXISTS dw_db; CREATE TABLE dw_db.dim_location ( country VARCHAR(255), city VARCHAR(255), people INT, continent VARCHAR(50) -- 新增字段,示洲 ); ``` 然后编写ETL脚本(这里用SQL模拟),将ODS数据转换并插入DW。注意:实际ETL过程可能更复杂,这里简化。 ```sql -- ETL过程:从ODS抽取,转换(这里我们根据国家设置洲),加载到DW INSERT INTO dw_db.dim_location SELECT country, city, people, CASE WHEN country = 'China' THEN 'Asia' WHEN country = 'USA' THEN 'North America' ELSE 'Other' END AS continent FROM ods_db.country_city_people; ``` 4. 在DM(dm_db)中创建,面向业务分析,例如:按国家汇总人口: ```sql CREATE DATABASE IF NOT EXISTS dm_db; CREATE TABLE dm_db.country_summary ( country VARCHAR(255), total_people INT, continent VARCHAR(50) ); -- 从DW汇总数据 INSERT INTO dm_db.country_summary SELECT country, SUM(people) AS total_people, MAX(continent) AS continent -- 假设同一个国家在同一洲 FROM dw_db.dim_location GROUP BY country; ``` 5. 账号权限分配: - ods_account:授予对ods_db的读写权限,用于接收源系统数据。 - dw_account:授予对dw_db的读写权限,同时授予读取ods_db的权限(用于ETL抽取)。 - dm_account:授予对dm_db的读写权限,同时授予读取dw_db的权限(用于从DW抽取数据)。 创建账号并授权的SQL示例(以MySQL为例): ```sql -- 创建ODS账号 CREATE USER 'ods_user'@'%' IDENTIFIED BY 'ods_password'; GRANT ALL PRIVILEGES ON ods_db.* TO 'ods_user'@'%'; -- 创建DW账号 CREATE USER 'dw_user'@'%' IDENTIFIED BY 'dw_password'; GRANT ALL PRIVILEGES ON dw_db.* TO 'dw_user'@'%'; GRANT SELECT ON ods_db.* TO 'dw_user'@'%'; -- 允许从ODS读取 -- 创建DM账号 CREATE USER 'dm_user'@'%' IDENTIFIED BY 'dm_password'; GRANT ALL PRIVILEGES ON dm_db.* TO 'dm_user'@'%'; GRANT SELECT ON dw_db.* TO 'dm_user'@'%'; -- 允许从DW读取 ``` 这样,我们就模拟了三数据仓库的账号创建和数据流转过程。 注意:实际环境中,ETL过程可能使用专门的ETL工具(如DataX、Kettle、Flink等)或编写Spark任务等,这里用SQL模拟。 根据引用[2],我们还可以考虑使用Iceberg这样的格式来构建湖仓一体,但这里我们使用传统的关系型数据库(如MySQL)来模拟。 总结:我们通过创建三个数据库(ods_db, dw_db, dm_db)和对应的三个账号(ods_user, dw_user, dm_user)来模拟三数据仓库数据ODS经过ETL进入DW,再从DW汇总进入DM。 §§相关问题§§ 1. 数据仓库中,ODS和DW的主要区别是什么? 2. 如何优化从ODS到DW数据抽取过程? 3. 在数据仓库中,数据集市(DM)通常服务于哪些业务场景? </think>### 创建ODS、DW、DM账号及模拟数据仓库流程 #### **1. 创建三账号(MySQL示例)** 分账号需遵循最小权限原则: ```sql -- ODS账号(仅操作原始数据) CREATE USER 'ods_user'@'%' IDENTIFIED BY 'ods_password'; GRANT SELECT, INSERT, UPDATE ON source_system.* TO 'ods_user'@'%'; -- 仅限源系统库[^3] -- DW账号(数据处理与整合) CREATE USER 'dw_user'@'%' IDENTIFIED BY 'dw_password'; GRANT SELECT ON ods_db.* TO 'dw_user'@'%'; -- 读取ODS GRANT ALL ON dw_db.* TO 'dw_user'@'%'; -- 全权操作DW -- DM账号(集市数据分析) CREATE USER 'dm_user'@'%' IDENTIFIED BY 'dm_password'; GRANT SELECT ON dw_db.* TO 'dm_user'@'%'; -- 读取DW GRANT ALL ON dm_db.* TO 'dm_user'@'%'; -- 全权操作DM FLUSH PRIVILEGES; ``` #### **2. 模拟三数据流转** **ODS** → **DW** → **DM**: ```sql -- Step1: ODS存储原始数据(模拟源系统) CREATE TABLE ods_db.sales_ods ( order_id INT PRIMARY KEY, product_id VARCHAR(20), sale_amount DECIMAL(10,2), order_date DATE ); INSERT INTO ods_db.sales_ods VALUES (1001, 'P2023', 899.00, '2023-10-01'), (1002, 'P4567', 1299.50, '2023-10-01'); -- Step2: DW清洗整合(示例DWD明细) CREATE TABLE dw_db.dwd_sales_dw AS SELECT order_id, product_id, sale_amount, order_date, CASE WHEN sale_amount > 1000 THEN '高价订单' ELSE '普通订单' END AS order_type -- 数据加工 FROM ods_db.sales_ods; -- 从ODS抽取[^1] -- Step3: DM聚合分析(面向业务) CREATE TABLE dm_db.dm_daily_sales AS SELECT order_date, SUM(sale_amount) AS total_sales, COUNT(order_id) AS order_count FROM dw_db.dwd_sales_dw -- 从DW读取 GROUP BY order_date; -- 生成日报 ``` #### **3. 数据验证查询** ```sql -- DM用户查询结果 SELECT * FROM dm_db.dm_daily_sales; -- 输出示例: -- | order_date | total_sales | order_count | -- | 2023-10-01 | 2198.50 | 2 | ``` #### **4. 关键设计说明** 1. **权限隔离** - ODS账号仅能读写原始数据,防止污染源数据[^3] - DW账号拥有ETL权限,可跨抽取清洗 - DM账号专注分析,禁止修改底数据 2. **分职责** - ODS:存储未加工的源数据(如`sales_ods`) - DW: - DWD(明细):字段清洗、维度退化(如`dwd_sales_dw`新增`order_type`) - DWS(汇总):轻度聚合(示例省略)[^2] - DM:主题域聚合(如`dm_daily_sales`日报)[^1] 3. **扩展建议** - 使用**Iceberg**实现湖仓一体:`CREATE TABLE ... USING iceberg`[^2] - 添加**调度任务**自动化ODS→DW→DM流转 - 在DW实施**数据质量监控**(如非空校验) > 通过账号权限控制+分ETL流程,实现数据从原始ODS)→ 整合(DW)→ 应用(DM)的安全流转[^1][^2]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值