数据分析的语言接口OLAP计算引擎是一架机器,而操作这架机器的是编程语言。使用者通过特定语言通知计算引擎,须要读取哪些数据、以及须要进行什么样的计算。编程语言有很多种,任何人都能够设计出一门编程语言,而后设计对应的编译器做解析。编程语言从分类上来说,能够分为命令式,申明式。
命令式编程语言是咱们最常见的编程语言,C/C++/Java等都是命令式编程语言,这类语言明确的通知机器应该执行什么样的指令,留给编译器优化的空间很小了。
申明式编程形容程序应该取得什么后果,至于如何做到,并不关注细节。SQL就是一种申明式编程语言。例如SQL语句select count(1) from department where kpi =3.25,指明计算kpi=3.25的人数,但不会具体指定如何实现计算。这给后续的优化器留下了很大的操作空间,优化器能够依据SQL的需要和理论的数据做各种各样的摸索,寻找到最佳的执行形式。
一个优良的剖析语言应该具备以下几个特色:
语言简略,门槛低语意明确,无歧义材料丰盛,不便学习生态丰盛,工具多不便扩大,可编排简单的逻辑
SQL是一种历史悠久的,应用比拟宽泛的剖析语言。在关系型数据库时代就宽泛应用的一种语言。在21世纪初,呈现了MapReduce算法,数据分析师须要编写MapReduce程序来剖析数据。MapReduce程序是一种命令式语言,编写过程十分麻烦,堪比写程序,这就须要数据分析师不仅具备算法能力,还要具备工程能力,应用体验十分蹩脚。这就须要两个团队来单干,BI团队把剖析需要传递给开发团队,由开发团队去开发分析程序。为了改善剖析体验,呈现了SQL on Hadoop的解决方案,典型的如Hive,提供SQL接口,并把用户输出的SQL转写成MapReduce执行打算,因此极大的晋升了数据分析的体验,实现了BI团队的自主剖析,升高了数据分析的门槛,大大增加了受众范畴。因而,SQL的影响力是十分大的。从Hive开始,大数据的次要应用接口就转移到了SQL上。而工程师们能够在SQL这张皮之下,分心的优化性能,无缝的降级计算引擎,放弃应用接口的一致性。
SQL的语法简略,逻辑清晰,理解了最简略的查问语句之后,就能够嵌套多层表白很简单的逻辑。SQL基于关系代数,有实践根底,保障语意明确没有歧义。SQL的倒退历史十分长远,因此学习材料也比拟多,不便新入门者学习。同时围绕SQL的生态也比拟丰盛,有很多工具应用SQL做剖析。
除了SQL之外,也有一些软件推出自定义的语言,例如Elasticsearch应用Lucene语法,Prometheus推出了自定义的PromQL,而Splunk推出了SPL。每一种新的语法,对于新用户而言,都存在肯定的学习门槛。因此都不如SQL应用宽泛。能够说SQL是数据分析的事实标准。
数据模型数据模型(DataModel) 用于形容数据在数据库中的组织模式。常见的模型有关系模型(Relational),键值模型(Key/Value),图模型(Graph),文档模型(Document),列簇模型(Column-family)等。 关系型数据库采纳关系模型。Redis采纳键值模型。图数据库采纳图模型。MongolDB采纳文档模型。关系模型中的关系有点绕口,在英文中是Relational,硬翻译成了关系,我的了解,关系指的是一些相互之间有关系的属性组成的一个实体,因为各个列属性之间存在关联关系,而被称为一个关系,其实指的是属性之间的相关性,这种相关性体现在:属于同一行;满足列之间的约束条件;满足行之间的约束条件;满足不同关系之间的约束条件。通过不同的约束条件,是全副的数据造成一种有组织的存在。
数据库通过关系模型,定义出一个个关系实体,确保内容之间满足肯定的束缚标间,并且提供编程接口去读写数据库内容。一个数据库蕴含一堆关系,每个关系是一个多行多列的表格。每一行的各个列之间是相干的,也可能会定义一些约束条件。行与行之间,也可能通过定义惟一键(Primary Key),定义排序形式来束缚行之间的关系。关系与关系之间,能够通过内部键来实现。
这种列之间和行之间的束缚关系,在OLTP场景中比拟实用,因为OLTP关注的数据自身,因而在存储数据时,更多关注数据的存储模式。而OLAP关注的数据的剖析,所以在数仓中,这些约束条件是弱化的,因而,在数仓中,咱们只需关注一张多行多列的表格即可,像PK、排序这类束缚属性,更多只是用来做数据减速的伎俩。关系模型用来作为一种紧密的实践,给执行器的优化提供实践根底。然而这个名字毕竟太绕口,在后续文章中,除非波及到关系模型相干的实践,会应用关系这个词,个别状况下,会用表来指代一个关系。
关系代数(Relational Algebra)关系模型和关系代数是SQL的实践根底。代数不仅是咱们所熟知的简略的加减乘除等数学计算。在计算机行业,咱们见到过多种algebra,在神经网络中罕用的线性代数(linear algebra),在电路中用到的布尔代数(boolean algebra),香农把布尔代数带入到了逻辑电路设计中,为计算机二进制计算提供了理论依据。此外还有N多种algebra,这里不一一列举。
关系代数,源自于汇合代数,讲述汇合之间的变换关系。关系代数中的一系列操作,承受一个或两个关系作为输出,产生一个新的关系作为后果。因为输出和输入都是一个关系,咱们能够串联多个算子,造成更加简单的算子。关系代数中蕴含的算子有: (select,从一个关系中筛选出局部行,造成一个新的关系),(projection,从一个关系中筛选出局部列,造成一个新的关系),∪(Union,合并两个关系), ∩(Intersection,取两个关系的交加局部), –(difference,取两个关系的差集局部), ×(Product,两个关系的笛卡尔积),⋈(Join,两个关系在满足某些条件下的连贯),(Rename,重命名关系中的列), ←(Assignments,把一个长期的查问命名成一个新的关系), (Duplicate Eliminating,去重), (Aggregation,对局部列做聚合计算,后果造成一个新关系), (Sorting,排序后果造成一个新关系)。这里定义了罕用的关系操作,名字曾经示意出了其操作的含意,在这里不再介绍每个操作的明细了。在语法解析和优化器阶段咱们会再次接触到关系代数,并且借助于关系代数的理论依据,来做一些语法树上的转换。在这里咱们只须要晓得在关系代数上有这些操作,并且在之后的SQL语法上看到如何用SQL语法来表白这些操作。
SQLSQL语言的倒退历史SQL的倒退历史,能够追溯到机械化数据分析的历史。在20世纪初,IBM次要的业务是打孔卡业务,也就是应用卡上的孔来记录信息,而后利用电路的通断判断是否有孔,并通过电路驱动机械安装,累计计算结果。打孔卡相似咱们古代应用的答题卡,答题卡的每一个题目,都提供了四个选项,而后用铅笔涂黑对应的选项;打孔卡不同的中央在于,选中的局部穿透成孔,当搁置到电路板上时,有孔的局部会有电流通过,进而触发之后的动作。这是在过后是一项十分先进的数据分析办法,相较于古老的依赖人去计数,也让大数据的自动化剖析成为可能。在20世纪初,要统计数千万人口的信息,须要投入大量的人力资源,而打孔卡这种创世纪的创造,带来了数据分析行业的疾速倒退。因而能够说IBM的业务次要是提供数据分析的机器,次要的客户场景是联邦政府的人口普查,以及业机构做商业剖析。这个时候,数据存储以来打孔卡,而数据计算是机械安装,计算结果输入到打印机。
到20世纪50年代,随着电气化的倒退,磁带取代打孔卡成为新的存储设备,电气安装取代机械安装做计数。计算结果能够持续存储到磁带上。磁带的存储空间很大,不过磁带的毛病是只能程序读写,这导致数据处理的程序不得不适应这种个性依照程序解决。
到了60、70年代,磁盘被创造进去,磁盘能够被随机读写,这极大的扭转了数据处理形式。数据结构无需思考数据之间的程序,一些更加简单的数据模型被创造进去,例如网状模型或者层次化模型。1970年,Edgar Codd定义了关系模型,给出了非过程式的查问数据的办法,关系型数据库诞生了。关系模型十分简洁,并且提供了实践根底。非过程式的查询方法,屏蔽了实现的细节,使用者只须要申明所须要的后果即可,实现的过程则交给优化器给出最优的执行打算,这极大的升高了应用门槛。关系模型的发明者也因而取得了图灵奖。只管关系模型在学术上十分吸引人,然而在事实中,在性能上还比不上曾经存在的数据库。
到了70年代前期、80年代,IBM推出了一个突破性的我的项目System R,在我的项目中研发了至关重要的可能使关系型数据库十分高效的技术。在System R中,IBM推出了SQL的最晚期版本,称为Sequal,起初演化成了SQL(Structed Query Language结构化查询语言)。这个我的项目尽管是个原型,然而它促成了之后IBM推出了第一个商用的关系模型的数据库产品System/38(1979),SQL/DS(1981),DB2(1983)。其中DB2目前还是沉闷的商用数据库,在大学中也有DB2的应用课程。至此,SQL语言呈现了,并且被其余的商用数据库系统所采纳,比方Oracle的数据库。在数十年内,SQL语言凭借着其易用性,击败了其余须要关怀底层实现的数据库产品,成为了事实上的规范。
1986年ANSI规范推出了SQL规范,称为SQL86,就是咱们常说的ANSI SQL。之后规范通过陆续补充,以增加新的个性,陆续呈现了SQL89,SQL92,SQL1999(正则式,触发器,OO), SQL2003(XML,窗口函数,Sequence,自增ID),SQL2006, SQL2008(清空表语法,Fancy Sorting), SQL2011(长期表,管道式DML), 最近的是SQL2016(Json,多态表)。
一般来说,一个数据分析系统,不肯定齐全遵循SQL的规范,这次要是由剖析零碎的特有个性所决定的,有些个性,在SQL规范里边是没有的,所以个别会在SQL规范上做一些拓展,号称是兼容ANSI SQL。一个零碎须要反对的最小性能汇合是SQL92规范。
SQL的性能SQL语法蕴含了几个类别的性能,别离是
Data Manipulation Language(DML):数据操作语言,用于增删改查数据。Data Definition Language(DDL):数据定义语言,用于定义表的格局。Data Control Language(DCL):数据管制语言,用于管制权限等。
尽管DML和DCL是SQL零碎的根底性能,本文的关注重点更多是数据处理的技术,以及如何放慢数据处理的技术,因而更多关注DDL。 在DDL中,也有增删改查,在这几项中,本文更多关注查的局部内容,即如何放慢数据的读取和计算。而数据的写入、存储局部的优化伎俩,也是为了满足减速数据计算的目标。
SQL的处理过程SQL全称Structed Query Language(结构化查询语言)。SQL语法简略,易学易用,是数据分析畛域最通用的语言。SQL是数据分析的操作工具,对于用户而言SQL代表浙用户的操作语义,然而对于程序而言,只是接管到一串字符串。程序须要了解SQL的意义,要通过词法剖析、语法分析、语义剖析、结构成形象语法树。词法剖析、语法分析是十分根底的操作。大学的计算机的编译原理课程应该蕴含了本局部内容,词法剖析和语法分析的模式是固定的,玩不出花色,无助于晋升计算速度。不过作为OLAP引擎中必不可少的第一环,还是有必要对词法剖析和语法分析做出简略的介绍,有助于理解后续章节中的查问打算和优化器,然而本章不会占用太多篇幅,本文的重点是对于计算速度的内容。
开发者也能够研发自定义的剖析语言,只有语言合乎肯定的规定,没有歧义,在语义上残缺,也能过称为一种语言。不过开发一个新的语言十分艰难,大多数的新语言采纳程序式编程,每一个短语示意一个简略的操作;或者采纳管道式申明语法,每一部分代表输出,计算和输入,然而要定义一种可能有限扩大而没有歧义的语法是很难的。在语义残缺水平上是不能和SQL相比拟的。无论是开发一门新的语言,还是采纳SQL,流程都和下图相似。OLAP引擎解析SQL,生成形象语法树,再转化成逻辑执行打算,通过优化后,生成高性能的算子组合。这就是编译和优化的过程。
图2-1 程序编译和SQL编译
...