大数据SQL优化:原理与实践
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

1.2 大数据为什么选用SQL

随着大数据生态的兴起和不断完善,我们已经能够有效地应对海量数据的存储和分析需求。这些数据不仅包括企业或用户在生产和经营过程中产生的结构化数据,还包括大量的音视频等非结构化数据。尽管非结构化数据分析相较于核心业务数据分析看似是锦上添花,但它并非孤立存在,其分析过程通常伴随着大量结构化数据的处理。例如在采集短视频时,我们通常还会收集到与之相关的结构化信息,包括短视频的作者、发布时间、标签和时长等。此外,一些非结构化数据在经过处理后,也可以转化为结构化数据。例如,我们可以从浏览网页的日志中提取出用户的IP地址、访问时间、搜索关键词以及浏览页面的详细信息等。

所谓的非结构化数据分析,实际上往往是针对伴随而来的结构化数据进行的。事实上,结构化数据分析仍然是大数据生态中的核心。相对而言,结构化数据处理技术更为成熟,例如我们常用的基于关系模型的关系型数据库。由于关系型数据库的广泛应用,数据分析师和数据开发人员对SQL非常熟悉,甚至我们的思维方式也习惯于SQL的逻辑。SQL在执行常规查询时相对简单,尽管它在处理复杂的过程计算或顺序运算时可能不太方便,但其他替代技术在这方面的表现也并不优越,在面对SQL难以表达的运算时,我们也不得不编写与UDF(User Defined Function,用户自定义函数)有同等复杂度的代码以达到目的。鉴于SQL具有标准化、上手难度低、移植成本低等特性或优点,大数据SQL应运而生。

1.2.1 标准化语言

SQL自1974年发布至今,经历了一系列的演变和变革,如今整个SQL标准体系日趋成熟。尽管不同的数据库产品之间存在一些差异,但是SQL的基本结构和语法在大多数关系型数据库中都是通用的。这意味着一旦用户掌握了SQL的基本语法和特性,便可以在不同的数据库系统中进行数据查询等操作,而无须重新学习新的语言或工具。

图1-1列举了SQL-92中的关键字,无论是关系型数据库还是大数据引擎,无论是Oracle、MySQL还是Spark、Flink,这些命令或者关键字所代表的含义都是一样的。

标准化的好处在于确保了SQL查询等操作在不同数据库系统之间具有一定的兼容性。这意味着用户只需编写一次SQL代码,便能够在各种不同的数据库系统中执行,而无须做出大量修改。这种跨平台的兼容性赋予了开发人员更大的灵活性,使我们能够根据需求选择最合适的数据库系统。同时,这也提升了学习SQL的价值,因为它的应用范围覆盖了众多数据库系统。一旦用户掌握了SQL的基础语法和原则,便能在不同的数据库环境中开展工作,无须为每种环境重新学习特定的查询语言或工具。SQL的标准化不仅加快了数据库应用程序的编写和维护速度,而且允许开发人员使用统一的SQL语句来执行数据检索、插入、更新和删除等操作,无须关注不同数据库间的细微差异。得益于SQL标准所确立的数据库操作的一致性和可预测性,SQL任务的错误和风险也得以降低。

图1-1 SQL-92中的关键字

1.2.2 声明式编程

SQL是声明式语言的典范,与我们所熟知的常规编程语言相比,SQL更强调“做什么”操作,即用户需要执行何种查询或数据操作,而无须详细说明如何执行这些操作。举个例子,假如我们有一个用户列表,需要查找手机号开头为“155”的用户。如果使用Python实现,那么可以按照以下方式编写代码。

这是一种命令式的方法,即提供达成目标的每一步指令并逐步执行。随着语言和框架的增多和不断演进,每种技术(这里指编程语言)的功能开始出现重叠,为完成相同的任务提供了众多不同的选项。例如,如果使用Java来实现上述需求,我们会采用以下方法。

如果用Scala实现,则是如下所示方法。

总之,现代编程语言和框架为开发者提供了丰富的工具和技术,允许我们能够以更高层次的抽象解决问题。然而,这也意味着新用户接入和迭代的难度大幅增加。此外,在跨业务模块、跨平台或系统时,可移植性也将受到很大挑战。如果我们采用SQL来实现上述需求,可能会这样编写代码。

这恰恰体现了声明式语言的核心理念—直接描述目标。不同于命令式编程的“怎么做”,声明式编程关注的是“要做什么”,它只描述期望达到的结果,而不涉及具体的执行步骤。声明式方法的高度抽象使用户能够专注于目标本身,而无须担心实现的具体细节。这种方法对用户更加友好,因为它减少了用户需要考虑的细节。更重要的是,声明式语言支持多种底层实现策略,这意味着在不改变目标的前提下,可以不断地对实现方式进行优化。例如,在前面提到的SQL案例中,我们可以通过遍历所有用户数据来实现目标,也可以利用索引来提高查询效率。

SQL的声明式性质使用户可以专注于表达想要的结果,而不必关心底层的实现细节。这对于处理大数据集和复杂查询非常重要,因为用户可以使用高层次的语言来操作数据,而不需要关注底层的分布式计算和处理逻辑。大数据引擎(如Hadoop、Spark等)可以根据用户的SQL自动进行查询优化和执行计划的生成。引擎会根据数据分布、集群资源等因素自动选择最优执行路径,将底层的优化工作留给引擎自己处理。声明式语言的特性使得它们可以应用于大数据处理领域,如分布式计算和大数据分析。这允许开发人员在不需要详细了解底层分布式架构的情况下,使用高级查询来处理大量数据。声明式语言所表达的“把方便留给用户,把麻烦留给自己”的哲学,结合SQL标准化的定义,使得SQL在大数据体系中得以大放异彩。

1.2.3 借鉴关系数据库成熟理论

尽管大数据生态在理念上与传统的关系型数据库存在显著差异,但它仍然能够借鉴关系型数据库及其关系模型的成熟理论和行业实践。例如,在大数据处理中广为人知的连接操作(JOIN),尽管需要考虑到分布式计算等特有的技术特性,但核心的实现算法依然是哈希连接、排序合并连接(参见图1-2)和循环嵌套连接。这些算法都源自关系型数据库的技术体系。

我们所关注并强调的SQL引擎优化,包括语法解析、基于规则的优化(RBO)、基于代价的优化(CBO)以及列式存储等,这些都是源自传统数据库技术的成熟实践。

传统关系型数据库的核心优势在于其久经考验的SQL优化器经验,但在可用性、容错性和可扩展性方面则略显不足,而大数据生态的技术优势在于其天然的可扩展性、可用性和容错性,但在SQL优化方面,几乎全部借鉴传统关系型数据库的经验。两者相互融合、相互借鉴,在不同数据处理场景中最大限度地发挥优势,以满足多样化的业务需求。

图1-2 Spark排序合并连接原理