2-dw_事实表、维度表

事实表:记录公司的一笔正常的业务数据,需要提供 4W ,什么时候 (When) 在什么地方 (Where) 有哪些人 (Who) 做了什么事 (What) 。为了方便后续分析,在设计事实表的时候,我们应该尽可能的提供详细的维度信息和度量信息。

比如我们在谈一家物流公司的数据仓库的时候,如何去设计落地一个事实表,我们按以下过程来落地。

1 :用户的目的:首先我们需要知道用户的目的,以价值为导向,解决用户的问题,这时用户会提出,目前公司营运成本太高,今年需要节省多少费用。

2 :定义指标:针对上面的目标,我们需要与用户一起来分析这个目标,可以用哪些指标来衡量这个目标往预期方向走,也就是我们所说的拆分目标,这个过程会多次沟通,反复的拆分和合并之前定义的指标,比如说最终我们统一认定有装载率、车辆营运公里数、单公斤成本,单公里成本这 4 个指标。

3 :指标细分:指标确认后,我们就需要细分指标数据 ( 多级指标 ) ,比如装载率这个指标,我们是否需要针对业务场景,区分早、中、晚时段的装载情况,不同车型 (5KG,10KG) 的装载率情况,对于单公斤成本和单公里成本我们是否需要清楚知道成本的费用项,比如司机成本、油费成本、车辆折旧成本等。

4 :定义相关字段和逻辑:有了以上细分指标的确定,接下来我们只与用户确认各个指标的逻辑和取数口径了, 设计好事实表的字段,验证是否满足用户的目的数据应用,假如有如下系统,我们对每个事实表字段确认源系统和后台表字段关系。

a :车辆调度系统:什么时候哪个车跑了哪条线。

b :结算系统:每次车的费用是多少。

c :装载系统:每个车每个线路的业务量信息。

5 :有了这些指标后我们快速实现和落地,提供一些分析报告,对前端业务做些改进方案,再来验证我们的指标是否往好的方向改变,同时成本也在降低,哪么我们整个方案和指标定义的非常好,如果指标在往好的方向改变,但成本并没有降低,哪么我们就要重新来定义某些指标是否正确了,就这样的一直迭代直到我们达到用户的目标。

 

维度表:是对事实表里的维度进行扩展更详细的信息补充。我们在定义一个维度表的时候,需要怎样设计呢?比如在事实表里有客户这样的一个维度,我们与用户沟通在他们来看客户这个维度主要关心的是哪些信息,达到什么样的目的,用户一般会想达到用户差异化的管理和销售,哪么我们就要抓住如何来区分客户的差异化的信息:

1 :基本属性:比如像客户规模( 1 千人、 1 万人)、地域(深圳、广州等)、行业(制造、互联网等)。

2 :按客户行为:层级(大客户、散客等)、销售量( 0-100 101-500 501-1000 等)。

 


来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/31535951/viewspace-2643357/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/31535951/viewspace-2643357/

要想在百度八亿网页的数据海洋中找到你所要的信息, 人工方式需要1200 多人年,而百度搜索技术不到1 秒钟。人 们被数据淹没,却渴望知识。商务智能技术已成为当今企业 获取竞争优势的源泉之一。商务智能通常被理解为将企业中 现有的数据转化为知识,帮助企业做出明智决策的IT工具集。 其中数据仓库、OLAP和数据挖掘技术是商务智能的重要组成 部分。商务智能的关键在于如何从众多来自不同企业运作系 统的数据中,提取有用数据,进行清理以保证数据的正确性, 然后经过抽取、转换、装载合并到一个企业级的数据仓库里, 从而得到企业数据的一个全局视图,并在此基础上利用适当 的查询分析、数据挖掘、OLAP等技术工具对其进行分析处理, 最终将知识呈现给管理者,为管理者的决策过程提供支持。 可见,数据仓库技术是商业智能系统的基础,在智能系统开 发过程中,星型模式设计又是数据仓库设计的基本概念之一。 星型模式是由位于中央的事实表和环绕在四周的维度表 组成的,事实表中的每一行与每个维度表的多行建立关系, 查询结果是通过将一个或者多个维度表事实表结合之后产 生的,因此每一个维度表事实表都有一个“一对多”的连 接关系,维度表的主键是事实表中的外键。随着企业交易量 的越来越多,星型模式中的事实表数据记录行数会不断增加, 而且交易数据一旦生成历史是不能改变的,即便不得不变动, 如对发现以前的错误数字做修改,这些修改后的数据也会作 为一行新纪录添加到事实表中。与事实表总是不断增加记录 的行数不同,维度表的变化不仅是增加记录的行数,而且据 需求不同维度表属性本身也会发生变化。本文着重讨论数据 仓库维度表的变化类型及其更新技术。
2.1 ODS层(原始数据层) 作用:存储原始数据,保持数据原貌 sql -- 创建ODS层表 CREATE EXTERNAL TABLE mini_dw_beauty.ods_beauty_order( order_id STRING, -- 订单ID user_id STRING, -- 用户ID user_name STRING, -- 用户名 brand STRING, -- 品牌 product STRING, -- 产品 unit_price DOUBLE, -- 单价 quantity INT, -- 数量 original_amount DOUBLE, -- 原始金额 province STRING, -- 省份 city STRING, -- 城市 order_time STRING, -- 订单时间(字符串格式) gender STRING, -- 性别 age_group STRING, -- 年龄分组 coupon DOUBLE -- 优惠券金额 ) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' STORED AS TEXTFILE LOCATION '/user/hive/warehouse/mini_dw_beauty.db/ods_beauty_order/'; 数据示例: text MEI202510110830459876,U0001234,用户3827,雅诗兰黛,小棕瓶精华,345.50,2,691.00,广东,广州市,2025-10-11 08:30:45,女,26-35,25.00 特点: 数据与源文件完全一致 使用TEXTFILE格式,便于Flume直接写入 不做任何数据清洗和处理 2.2 DWD层(数据清洗层) 作用:数据清洗、转换、标准化 sql -- 创建DWD层表 CREATE TABLE mini_dw_beauty.dwd_beauty_order( order_id STRING, -- 订单ID user_id STRING, -- 用户ID user_name STRING, -- 用户名 brand STRING, -- 品牌 product STRING, -- 产品 unit_price DOUBLE, -- 单价 quantity INT, -- 数量 original_amount DOUBLE, -- 原始金额 net_amount DOUBLE, -- 净金额(新增计算字段) province STRING, -- 省份 city STRING, -- 城市 order_date DATE, -- 订单日期(从order_time解析) order_hour INT, -- 订单小时(从order_time解析) gender STRING, -- 性别 age_group STRING, -- 年龄分组 coupon DOUBLE -- 优惠券金额 ) PARTITIONED BY (dt STRING) -- 按日期分区 STORED AS ORC; -- 使用ORC列式存储 ETL处理逻辑: sql -- ODS到DWD的数据清洗转换 INSERT OVERWRITE TABLE dwd_beauty_order PARTITION(dt) SELECT order_id, user_id, user_name, brand, product, unit_price, quantity, original_amount, original_amount - coupon AS net_amount, -- 计算净金额 province, city, to_date(cast(order_time as timestamp)) AS order_date, -- 字符串转日期 hour(cast(order_time as timestamp)) AS order_hour, -- 提取小时 gender, age_group, coupon, to_date(cast(order_time as timestamp)) AS dt -- 分区字段 FROM ods_beauty_order WHERE length(order_id) > 0 -- 数据清洗:去除空订单号 AND unit_price > 0 -- 数据清洗:去除0或负单价 AND quantity > 0; -- 数据清洗:去除0数量 数据示例: text order_id: MEI202510110830459876 net_amount: 666.00 (691.00 - 25.00) order_date: 2025-10-11 order_hour: 8 dt: 2025-10-11 特点: 数据清洗和标准化 增加衍生字段(net_amount, order_date, order_hour) 使用ORC格式,提高查询性能 按日期分区,便于数据管理 2.3 DWS层(数据服务层) 作用:轻度聚合,按维度汇总数据 2.3.1 省份维度聚合表 sql CREATE TABLE mini_dw_beauty.dws_province_day( province STRING, -- 省份 order_date DATE, -- 订单日期 order_cnt BIGINT, -- 订单数量 total_amount DOUBLE, -- 总销售额 avg_amount DOUBLE, -- 平均订单金额 user_cnt BIGINT -- 用户数量(UV) ) PARTITIONED BY (dt STRING) STORED AS ORC; 聚合逻辑: sql INSERT OVERWRITE TABLE dws_province_day PARTITION(dt) SELECT province, order_date, COUNT(*) AS order_cnt, -- 订单总数 SUM(net_amount) AS total_amount, -- 销售总额 ROUND(AVG(net_amount), 2) AS avg_amount, -- 平均客单价 COUNT(DISTINCT user_id) AS user_cnt, -- 去重用户数 order_date AS dt FROM dwd_beauty_order GROUP BY province, order_date; 数据示例: text province: 广东 order_date: 2025-10-15 order_cnt: 1850 total_amount: 1245680.50 avg_amount: 673.34 user_cnt: 1523 2.3.2 品牌维度聚合表 sql CREATE TABLE mini_dw_beauty.dws_brand_day( brand STRING, -- 品牌 order_date DATE, -- 订单日期 order_cnt BIGINT, -- 订单数量 total_amount DOUBLE, -- 总销售额 avg_amount DOUBLE -- 平均订单金额 ) PARTITIONED BY (dt STRING) STORED AS ORC; 聚合逻辑: sql INSERT OVERWRITE TABLE dws_brand_day PARTITION(dt) SELECT brand, order_date, COUNT(*) AS order_cnt, SUM(net_amount) AS total_amount, ROUND(AVG(net_amount), 2) AS avg_amount, order_date AS dt FROM dwd_beauty_order GROUP BY brand, order_date; 数据示例: text brand: 海蓝之谜 order_date: 2025-10-15 order_cnt: 980 total_amount: 1856780.50 avg_amount: 1894.67 2.4 ADS层(应用数据层) 作用:面向业务的最终报表,直接支持决策 2.4.1 省份统计报表 sql CREATE TABLE mini_dw_beauty.ads_province_stats( stat_date DATE, -- 统计日期 province STRING, -- 省份 order_cnt BIGINT, -- 订单数量 total_amount DOUBLE, -- 总销售额 avg_amount DOUBLE, -- 平均订单金额 user_cnt BIGINT, -- 用户数量 province_rank INT -- 省份排名 ); 生成逻辑: sql INSERT OVERWRITE TABLE ads_province_stats SELECT order_date AS stat_date, province, order_cnt, total_amount, avg_amount, user_cnt, ROW_NUMBER() OVER(ORDER BY total_amount DESC) AS province_rank -- 按销售额排名 FROM dws_province_day; 数据示例: text stat_date: 2025-10-15 province: 广东 order_cnt: 1850 total_amount: 1245680.50 avg_amount: 673.34 user_cnt: 1523 province_rank: 1 2.4.2 品牌统计报表 sql CREATE TABLE mini_dw_beauty.ads_brand_stats( stat_date DATE, -- 统计日期 brand STRING, -- 品牌 order_cnt BIGINT, -- 订单数量 total_amount DOUBLE, -- 总销售额 avg_amount DOUBLE, -- 平均订单金额 brand_rank INT -- 品牌排名 ); 生成逻辑: sql INSERT OVERWRITE TABLE ads_brand_stats SELECT order_date AS stat_date, brand, order_cnt, total_amount, avg_amount, ROW_NUMBER() OVER(ORDER BY total_amount DESC) AS brand_rank -- 按销售额排名 FROM dws_brand_day; 数据示例: text stat_date: 2025-10-15 brand: 海蓝之谜 order_cnt: 980 total_amount: 1856780.50 avg_amount: 1894.67 brand_rank: 1ADS层 根据DWS层的数据对省份排名 平均客单价 最受欢迎品牌最受欢迎产品 ADS层 根据DWS层的数据品牌排名 销量 销售额 增长率 市场份额 ADS层 计算各年龄层top3的品牌偏好 并计算出在品牌在年龄层中的占比 ADS层 对库存健康进行分析 包含产品名称、品牌、当前库存、日均销量、库存覆盖天数、库存状态、安全库存水平、滞销比例、缺货风险等级
最新发布
11-01
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值