Hadoop之数据仓库设计

Posted _TIM_

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Hadoop之数据仓库设计相关的知识,希望对你有一定的参考价值。

维度表和事实表

事实表:
在多维数据仓库中,保存度量值的详细值或事实的表称为事实表,事实表的记录在不断地动态增长,所以它的体积通常远大于其他表。
维度表:
在事实表中使用整数键值时,维度成员的名称需要放到另一种表中——也就是维度表。通常,事实表中的每个维度都有一个维度表。维度表可以看作是用户来分析数据的窗口,纬度表中包含事实数据表中事实记录的特性,有些特性提供描述性信息,有些特性指定如何汇总事实数据表数据,以便为分析者提供有用的信息。
结论:

  1. 事实表就是你要关注的内容;
  2. 维度表就是你观察该事务的角度,是从哪个角度去观察这个内容的。

例如,某地区商品的销量,是从地区这个角度观察商品销量的。事实表就是销量表,维度表就是地区表。

实例:

事实表: 客户创建信息表
维度表: 销售信息表、店铺信息表、跟进表/约见表/风控通过表/订单表的维度上卷。

星型模型和雪花模型

维度建模是一种将大量数据结构化的逻辑设计手段,包含维度和指标,它不像ER模型目的是消除冗余数据,维度建模是面向分析,最终目的是提高查询性能,所以会增加数据冗余,并且违反三范式。

根据事实表和维度表的关系,又可将常见的模型分为星型模型和雪花型模型。在设计逻辑型数据的模型的时候,就应考虑数据是按照星型模型还是雪花型模型进行组织。

模型位于数据仓库的DWD层对ODS层数据进行清洗(去除空值,脏数据,超过极限范围的数据),维度退化,脱敏等。需构建维度模型,一般采用星型模型,呈现的状态一般为星座模型。

星型模型: 是一种多维的数据关系,它由一个事实表和一组维表组成。每个维表都有一个维作为主键,所有这些维的主键组合成事实表的主键。事实表的非主键属性称为事实,它们一般都是数值或其他可以进行计算的数据,星型架构是一种非正规化的结构,多维数据集的每一个维度都直接与事实表相连接,所以数据有一定的冗余:

雪花模型: 当有一个或多个维表没有直接连接到事实表上,而是通过其他维表连接到事实表上时,其图解就像多个雪花连接在一起,故称雪花模型。雪花模型是对星型模型的扩展。它对星型模型的维表进一步层次化,原有的各维表可能被扩展为小的事实表,形成一些局部的 "层次 " 区域,这些被分解的表都连接到主维度表而不是事实表。雪花型模型通过最大限度地减少数据存储量以及联合较小的维表来改善查询性能。雪花型结构去除了数据冗余。

星座模型:

星座模型是由星型模型延伸而来,星型模型是基于一张事实表而星座模式是基于多张事实表,并且共享维度表信息,这种模型往往应用于数据关系比星型模型和雪花模型更复杂的场合。星座模型需要多个事实表共享维度表,因而可以视为星形模型的集合,故亦被称为星系模型

星型模型vs雪花模型

  • 星型模型因为数据的冗余所以很多统计查询不需要做外部的连接,因此一般情况下效率比雪花型模型要高。
  • 星型结构不用考虑很多正规化的因素,设计与实现都比较简单。
  • 雪花型模型由于去除了冗余,有些统计就需要通过表的联接才能产生,所以效率比较低。

根据项目经验,一般建议使用星型模型。因为在实际项目中,往往最关注的是查询性能问题,至于磁盘空间一般都不是问题。当然,在维度表数据量极大,需要节省存储空间的情况下,或者是业务逻辑比较复杂、必须要体现清晰的层次概念情况下,可以使用雪花型模型。
星型模型设计步骤:

  • 选择需要进行分析决策的业务过程。业务过程可以是单个业务事件,比如交易的支付、退款等;也可以是某个事件的状态,比如当前的账户余额等;还可以是一系列相关业务事件组成的业务流程,具体需要看我们分析的是某些事件发生情况,还是当前状态,或是事件流转效率。
  • 选择粒度。在事件分析中,我们要预判所有分析需要细分的程度,从而决定选择的粒度。粒度是维度的一个组合。
  • 识别维表。选择好粒度之后,就需要基于此粒度设计维表,包括维度属性,用于分析时进行分组和筛选。
  • 选择事实。确定分析需要衡量的指标

Hive窗口函数

row_number()、rank()、dense_rank()
将数据按照name分区,并按照orderdate排序,返回排序序号

  • ROW_NUMBER() OVER (PARTITION BY name ORDER BY orderdate) AS f2
  • RANK() OVER (PARTITION BY name ORDER BY orderdate) AS f3
  • DENSE_RANK() OVER (PARTITION BY name ORDER BY orderdate) AS f4

ROW_NUMBER()返回的是一列连续的序号: 1、2、3、4、5、6
RANK()对于数值相同的这一项会标记为相同的序号,而下一个序号跳过。如1、2、3、4、4、6
DENSE_RANK()对于数值相同的这一项,也会标记为相同的序号,但下一个序号并不会跳过。如1、2、3、4、4、5

以上是关于Hadoop之数据仓库设计的主要内容,如果未能解决你的问题,请参考以下文章

数据仓库之事实表设计

数据仓库之HDFS磁盘

Hadoop之数据仓库概述

Hadoop之数据仓库概述

数据仓库 - 在事实表中存储历史数据

技术贴hadoop之hive数据仓库的常用语句,请随时翻阅