1.1 事实表
发生在现实世界中的操作型事件,其所产生的可度量数值,存储在事实表中
。从最低的粒度级别来看,事实表行对应一个度量事件,反之亦然。
事实表表示对分析主题的度量。比如
一次购买行为我们就可以理解为是一个事实
。
图中的订单表就是一个
事实表
,可以理解他就是
在现实中发生的一次操作型事件
,每完成一个订单,就会在订单中增加一条记录。
事实表的特征
:
表里没有存放实际的内容,他是一堆主键的集合,这些ID分别能对应到
维度表
中的一条记录
。事实表包含了与各维度表相关联的
外键
,可与维度表
关联
。事实表的度量通常是数值类型(条/个/次),且
记录数会不断增加,表数据规模迅速增长
。
1.2 维度表
维度表示要对数据进行分析时所用的一个量
,比如你要
分析产品销售情况
,你可以选择
按类别进行分析,或按区域分析
。
这样的按…分析就构成一个维度
。上图中的用户表、商家表、时间表这些都属于维度表。这些表都有一个唯一的主键,然后在表中存放了详细的数据信息。
例如:
交易金额分析分析
男性用户的订单金额、联想商品的订单金额、第一季度的订单金额、手机的订单金额、家里下单的订单金额
例如:
学生分析
姓张的同学有多少、男性的同学有多少、江苏的同学有多少、身高小于170cm的同学有多少、年龄小于23岁的同学有多少。
维度表的特征
:
每个维度表都包含单一的主键列。
维度表的主键可以作为与之关联的任何
事实表
的外键,当然,维度表行的描述环境应与事实表行完全对应。
维度表通常比较宽,是扁平型非规范表,包含大量的低粒度的文本属性。
总的说来,在数据仓库中不需要严格遵守规范化设计原则。因为数据仓库的主导功能就是面向分析,以查询为主,不涉及数据更新操作。
需要强调的是:
事实表的设计是以能够正确记录历史信息为准则。
维度表的设计是以能够以合适的角度来聚合主题内容为准则。
1. 为什么要分层
分层的主要原因是在管理数据的时候,能对数据有一个更加清晰的掌控,详细来讲,主要有下面几个原因:
清晰数据结构:
每一个数据分层都有它的作用域,这样我们在使用表的时候能更方便地定位和理解。
方便数据血缘追踪:
简单来说,我们最终给业务呈现的是一个能直接使用业务表,但是它的来源有很多,如果有一张来源表出问题了,我们希望能够快速准确地定位到问题,并清楚它的危害范围。
减少重复开发:
规范数据分层,开发一些通用的中间层数据,能够减少极大的重复计算。
把复杂问题简单化:
将一个复杂的任务分解成多个步骤来完成,每一层只处理单一的步骤,比较简单和容易理解。而且便于维护数据的准确性,当数据出现问题之后,可以不用修复所有的数据,只需要从有问题的步骤开始修复。
屏蔽原始数据的异常:
屏蔽业务的影响,不必改一次业务就需要重新接入数据。
数据运营层(ODS)
Operate data store(操作数据-存储),是最接近数据源中数据的一层,数据源中的数据,经过抽取、洗净、传输,也就说传说中的ETL之后,装入ODS层
。本层的数据,总体上大多是按照源头业务系统的分类方式而分类的。
例如:MySQL里面的一张表可以通过sqoop之间抽取到ODS层。
ODS层数据的来源方式
:
经常会使用sqoop来抽取,比如我们每天定时抽取一次。在实时方面,可以考虑用canal监听mysql的binlog,实时接入即可。
线上系统会打入各种日志,这些日志一般以文件的形式保存,我们可以选择用flume定时抽取,也可以用用
spark streaming
或者
Flink
来实时接入,当然,
kafka
也会是一个关键的角色。
来自ActiveMQ、Kafka的数据等。
5、ST 数据应用层(ADS层)
ST层面向用户应用和分析需求
,包括前端报表、分析图表、KPI、仪表盘、OLAP、专题等分析,
面向最终结果用户
;
适合作OLAP、报表模型,如ROLAP , MOLAP;
联机事务处理OLTP
、
联机分析处理OLAP
。
OLTP是传统的关系型数据库的主要应用,主要是基本的、日常的事务处理,例如银行交易。OLAP是数据仓库系统的主要应用,支持复杂的分析操作,侧重决策支持,并且提供直观易懂的查询结果。
OLAP联机分析处理的用户是企业中的专业分析人员及管理决策人员,他们在分析业务经营的数据时,从不同的角度来审视业务的衡量指标是一种很自然的思考模式。例如分析销售数据,可能会综合时间周期、产品类别、分销渠道、地理分布、客户群类等多种因素来考量。
根据DW层经过聚合汇总统计后的粗粒度事实表
建模方式及原则:
保持数据量小
;
维度建模,星形模型
;
各位维度代理键+度量;
增加数据业务日期字段,支持数据重跑;
不分表存储
本次关于数仓【维度模型设计】与【分层架构】的内容就到这里!
如果以上过程中出现了任何的纰漏错误,烦请大佬们指正????
受益的朋友或对大数据技术感兴趣的伙伴记得点赞关注支持一波????
python逻辑分类 python中逻辑量有哪几个
常用内置常量None 常用来表示没有值的对象True(真)与False是python的逻辑类型数据(bool类型数据)python中逻辑假包括False、None、0、"(空字符串)、()(空元组)、[](空列表)、{}(空字典),而其余值都视为真python中逻辑运算符包括与(and)、或(or)、非(not)not
not False值为True
not()值为True
not 3值为Fals
java 中中文怎么排序 java汉字按拼音排序
最近项目上使用到汉字排序的问题,网上搜索了一下后普遍使用下面的方法比较。@Test
public void test_sort_pinyin() {
Collator cmp = Collator.getInstance(java.util.Locale.CHINA);
String[] arr = { "张三", "李四", "王五", "赵六", "JAVA", "