引言
初学数据仓库时,心中多少会有一个困惑。那就是后台服务器也就十几张表,为什么使用分层架构+维度建模搭建数仓时就要创建几十张甚至上百张表?这就好比发面馒头,放到蒸笼一蒸,个头就变大了不少。
那数据仓库是不是把一个简单的问题搞得更复杂了呀?
呵呵,这正是数据仓库的分层架构+维度建模的核心价值所在。让我详细解释这个现象背后的原理。
数据仓库到底有何价值?
我们知道,企业耗费精力搭建数据仓库,目的是为公司的服务或产品做分析数据,最终为公司决策者提供更可靠的数据依据,这就是所谓的商业BI(商业智能)。现在都信息时代了,如果公司老板还在靠拍脑袋做决定,想一想就很不靠谱。
如果公司没有数据仓库,那是不是就不能做分析数据呀?当然不是。
人家有些小微公司,就靠一张 excel 表格就搞定了,照样做数据分析。当然,那是因为小微公司的服务或产品规模小,数据量也就很有限,excel 表格本身就自带很多数据分析功能,足够小公司使用了。
如果觉得 excel 表格分析能力有限,那么就可以使用 python 做数据分析。因为 python 有更强大的数据分析库,比如 numpy、pandas等。不过,这需要你得有一定的 python 编程能力,这对于普通人来说是有门槛的。
那公司大了,数据量也更大,excel 表格就已经容纳不下了,那就要用专门的后台数据库来装,比如 MySQL、Oracle、PostgreSQL。
我们知道,这些都是关系型数据库表,并且支持 SQL 语言,而 SQL 语句具有极强的查询能力,我们通过编写 SQL 语句就可以满足各种数据分析要求。
既然如此,那不就没数据仓库啥事了呀?别着急。
这里存在两个问题。
问题一:数据库不保存历史记录
也就是说,数据库里保存的数据永远是当前状态的数据。比如我修改一条数据库记录,那么它就会覆盖以前的记录。如果我想要查询修改前的记录,那肯定是查不到了。
而数据分析不仅要分析当前的数据,也要分析以前的数据。比如分析用户流失数,也就是之前活跃过的用户,最近一段时间未活跃。
问题二:随着数据量增大查询性能变差
一般表记录达到 2000 万行,当然,这个数字并非一个硬性规定,而是一个基于经验的性能拐点提示,全表扫描等操作的性能会显著下降。
而数据分析的需求中,有很多都需要做统计,需要全表扫描。如果表记录达到上亿,那数据分析的性能就会更差,耗时更久。
这两个问题对于企业来说,哪一个都是无法接受的。
随着大数据技术的兴起,分布式数据存储和并行计算,大大提升了数据存储和计算能力,为数据仓库提供了底层基座。
数据仓库的价值在于解决的数据库存在的两大问题。
OLTP 和 OLAP
难道数据库自身就无法解决这两大问题吗?是的。
因为 MySQL、Oracle、PostgreSQL 等数据库的设计并不是为数据分析而来,它们更在乎事务处理和数据一致性等,也就是所谓的 OLTP(联机事务处理),它更适合用于后台服务器的数据存储,以支撑业务交易。
而数据仓库的设计则是为数据分析而来,它能够存储海量的历史记录,支持复杂的聚合分析,数据分析性能更好,耗时更短,也就是所谓的 OLAP(联机分析处理)。
分层架构+维度模型
说了半天,似乎还是没有解释“后台服务器就十几张表,为什么要建几十张表的数仓?” 是的。
我们知道,数据仓库是为数据分析而生,它自然要解决数据库存在的两大问题。
那它是如何解决的呢?或者说,它解决问题的思路如何?
来看第一个问题,数据仓库必须可以保存历史记录。
这个问题比较好办。首先,数据仓库采用分布式存储,比如 HDFS 是分布式文件系统,HBase、MongeDB 等也是分布式数据库,支持横向扩展,只要增加服务器,理论上可以支持无限存储。接着,就可以通过datax、flume、sqoop等采集工具将数据采集到数据仓库中。数据采集分为全量同步和增量同步,全量同步就是把数据库中所有数据都采集,增量同步就只采集有变化的数据,这样数据仓库就可以保存历史记录了。
来看第二问题,数据仓库必须有更好的查询性能。
未完待续