数仓避坑:想清楚维度

数仓系列的文章,写到了第三篇,终于开始聊维度了。

维度,这个词非常常见,但也抽象。在数仓、数分场景里,维度到底是什么?来看看这篇吧。

一、维度是什么

不懂就问,维度是什么?我们学习的自然反应,自然是去查阅专业资料。

1)阿里dataphin产品简介——基本概念是这样介绍维度:人们观察事物的角度,是指一种视角,是确定事物的多方位、多角度、多层次的条件和概念。

2)华为DGC产品介绍——基本概念如此介绍维度:维度是用于观察和分析业务数据的视角,支撑对数据汇聚、钻取、切片分析,用于SQL中的Group by条件。多数维度具有层级结构,如:地理维度、时间维度。

3)再看看《数据仓库工具箱》怎么说的。

维度能提供围绕某一业务过程所涉及的 “谁、什么、何处、何时、为什么、如何” 等背景。维度表包含BI应用所需要的用于过滤及分类事实的描述性属性。

牢牢掌握事实表的粒度,就能够将所有可能存在的维度区分开。当与给定事实表进行关联时,任何情况下都应该使维度保持单一值。

4)再看《阿里巴巴大数据之路》怎么说的。

维度是维度建模的基础和灵魂。在维度建模中,将度量称为 “事实” 将环境描述为 “维度” ,维度是用于分析事实所需要的多样环境

例如,在分析交易过程时,可以通过买家、卖家、商品和时间等维度描述交易发生的环境。

维度所包含的表示维度的列,称为维度属性。

维度属性是查询约束条件、分组和报表标签生成的基本来源,是数据易用性的关键。维度的作用一般是查询约束、分类汇总以及排序

不知道你第一次看到这些解释作何感想,我的真实的反应是:对方好好地给我讲人话,为什么我听不懂。

说实在的,这些解释,非常专业,也很硬核,但理解起来是有点困难的,没怎么接触过数据的伙伴估计有点懵。

二、维度怎么来的

维度,到底是什么呢?为什么它叫维度呢?

学习新知识的时候,并不只要看权威的书,任何能给你启发、能帮助你理解的书,都是好书。

一本书看不懂,多换几本看看,要是看完还不懂,那就尝试回归本质吧。

让我们先忘掉维度模型忘掉数据,忘掉维度。

来,一起玩个游戏快问快答游戏:在30秒内说出尽可能多的筷子、勺子的相同点和不同点。

看到这个问题,你会如何描述、对比它们呢?

思考过后,我给你加个条件。问题变成:筷子和勺子在使用方式上的相同点和不同点是什么?

看到新问题,你内心是不是有点方向了,觉得更容易回答了?

这其实是《大象·Thinking in UML》里面一个有意思的互动测试,当时我看到这个问题,脑子非常混乱,一时词穷,相同点和不同点我没说出来多少。一方面平时观察得少,另一方面,抽象训练得也少。

作者说:这个问题没有标准答案,这个问题反映你是否会从抽象的方法去看待事物。在不知不觉中,每一组相同点和不同点都来自于你的一个抽象角度。

例如,当从用途的角度去抽象时,他们的相同点是三者都是餐具,而不同点是筷子用于夹,勺子用来舀;从字面上理解,他们都来带了“子”,还有其他的相同、不同点就不多说了,重点是这句:从不同的抽象角度可以得出非常不同的结果

作者还说,抽象角度的不同,决定了建模方向的不同。我之前讲过什么是建模吗?描述一个东西,就是在建模。

为什么给出分类后,会更容易回答。因为找到了合适的对比分析的角度,问题就会简单很多。

什么是维度,再看看这句话:维度就是观察事物的角度维度是抽象的对客观事物的描述。

维度本不存在。是人类观察事物、分析问题分类归纳得来的,每个人都可以创造自己的维度。

维度一直都存在只是我们发现了它,用某种方式描述了它。

三、维度和粒度的关系

上一篇文章,讲过粒度,那么这里就要将维度和粒度联系起来学习。

1)维度有层级结构,不同层级对应不同的粒度。

地理维度有不同的层级:国家、省/自治州/直辖市、市、县,时间维度也有不同的层级和粒度:年度、季度、月度、星期、天等。

正如有了要描述的事情,确定了粒度,再去找对应的维度。比如,订单系统,会记录下单的时间信息,时间维度上,粒度会细到秒。学籍系统,学生户籍信息中,要填入地区维度的信息,粒度要细化到省市。

2)维度的组合越多,粒度越细细

客观的世界,是多维的。描述一个客观事物,维度(通常配合相应的度量)越多,粒度越细。

比如一个箱子,我们可以描述其长宽高,还可以描述颜色。不同描述维度组合越多,粒度越细,描述也越细致。

3)随着事物的变化,描述的维度可以增加

一个箱子会经历生产、运输、送货上门等环节,从产地送达到顾客手中。

箱子被生产出来后,没有品牌、产地属性,或者说属性值为空。未经历运输过程的箱子,没有快递公司、配送员属性。

但是人们可以赋予它这些维度,并且填入维度值。维度是基于人类描述客观事物的需要,被创造来的。

4)有的维度,没有直接的数字度量

从客观唯物主义的角度来说,某个实体的存在,长、宽、高这种比较客观的维度属性,是有确定值的。

但某些主观的东西,也是需要被描述的。比如,人的帅气程度。我们就简单分两类:很帅、一般。

这种主观的维度,没有绝对精确的度量值,无法直接和数字划上等号。

但聪明的我们依然可以定性、定量地测算进而描述。比如搞投票,得分超过90为很帅,60-90为一般。

但这种方式,只能估算,没有四海皆准的定值,不同的人群,投票结果不同。

四、两个有意思的维度问题

上面我提到的两本经典书籍里,介绍了非常多维度的问题。这里我只说自己碰到的 2 个我思考很久的问题。

1)维度的角色

维度模型里,很多人不理解什么是维度角色。包括最开始的我自己。

数仓避坑-想清楚维度

淘宝的业务过程大家应该很熟悉,涉及4个关键步骤:买家下单、买家付款、卖家发货、买家确认收货。

每个过程,都会涉及一个对应的时间,即下单时间、支付时间、发货时间、确认收货时间。

如果只分析其中的一个业务过程,比如买家下单,那只需要一个时间字段即可。

但是分析完整四个过程时,如果还只有一个时间字段,那如何区分其具体含义呢?到底是下单还是支付时间,搞不清楚。

只有一个字段,肯定不够。那必然要有 4 个时间字段。而且我们会给不同的命名,下单、支付、发货、确认收货作为时间的前缀。

这样一来,咱们看的人是能理解各个数字的含义了。但不仅如此,还得让计算机系统也理解。

所以,要弄一个 “维度角色”的字段来标识,以便计算机能理解。

数仓避坑-想清楚维度

在写SQL脚本的时候,Left join 相同的维度表两次,要给维度表取别名,这样才不会报错。

2)维度和One data 理论的关系

当我在研究华为的DAYU(现在叫做DGC)产品时,我发现,基于指标生成的SQL,都是 left join 维度表 on 维度表的主键,而且是 group by 维度表的主键。

当时没时间仔细研究,先抄了作业。

后续就碰到不少同事提出疑惑:为什么要如此设计?日期维度表里,还有周、月、年等字段,为什么不能支持按照这些字段进行 group by,一定只能按照维度表的主键的粒度进行汇总?

当我站在数仓层的时候,我无法回答,因为传统数仓,把维度模型建出来就好了。但当我跳到第二层 One data 理论的时候,我仿佛了解了一些(我也不确认自己是否完全懂了)。

我的体会就是:维度表就代表着一种粒度,基于相同统计粒度的指标,才能聚合到同一个表中。

从 SQL 的角度来看,都按照某个维度表主键进行 group by 的指标,能合并到一个表里面,最终能基于维度表的主键,将维度表的非属性字段也冗余到表中。

关于维度,还有很多,缓慢变化维、层次维度、杂项维度等等问题,大家可以自行看经典的书籍或找高人求教~

五、总结

正如书籍里面所说,维度模型的灵魂,就是维度。

之前看《幕后产品》书中提到陆游的一句诗:汝果欲学诗,功夫在诗外。

学习维度,也是如此。知识不是孤立的,搞清楚维度,要联合粒度、事实等模块去理解,必要的时候,还要结合生活。

本文仅记录自己学习维度模型、实践过程中所踩的坑。如有错误,请各位指教。下一篇,将会分享维度模型中的“事实”。

 

作者:lee;公众号:乐说乐言

本文作者 @lee

版权声明

本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处。如若内容有涉嫌抄袭侵权/违法违规/事实不符,请点击 举报 进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部