结构化查询语言( Structured Query Language )简称 SQL,是一门 ANSI 的标准计算机语言,用来访问和操作数据库系统。通常支持 SQL 的数据库系统,都可以让用户使用 SQL 查询数据、更新和删除数据,以及管理数据库系统。
作为一个异构数据分析平台,鸿鹄选定了 SQL 作为用户分析数据和管理数据平台当中的元数据的接口语言。但是,由于鸿鹄聚焦于非结构化数据和半结构化数据分析,所以鸿鹄实现的 SQL 和关系型数据库实现的 SQL 有一定的不同。
本文将主要介绍鸿鹄 Schemaless SQL(以下简称鸿鹄 SQL)的基本概念、 SQL 支持的功能概览和 SQL 查询任务运行的顺序。
同时,会详细说明鸿鹄 SQL 和关系型数据库的 SQL 之间的异同点。
读时建模和鸿鹄 SQL
鸿鹄 SQL 在解析完成之后,会生成计算任务。这些计算任务会提交到鸿鹄读时建模计算引擎进行执行。读时建模计算引擎保证了灵活地分析异构数据。因为鸿鹄 SQL 生成的计算任务需要配合读时建模计算引擎执行,所以鸿鹄 SQL 会和常见的关系型数据库的 SQL 有一些差异点。
在介绍鸿鹄 SQL 之前,我们先介绍和明确读时建模( Schema On Read )的概念。
什么是读时建模
读时建模是一种在读取数据的时候,根据特定规则把数据的信息动态提取的技术,使用该技术分析数据的时候,数据的模式 (Schema)只有在进行数据分析运算的时候,才根据算法的逻辑和输入的数据来动态决定的,在存储数据的时候,不需要指明数据对应的 Schema。
由于在接收数据的时候并不需要指明数据的 Schema,系统会把数据按照原始收到的内容进行存储,最大限度的保证了数据的完整性。同时保证,能够灵活的低成本,快速地的接收非结构化、半结构化和结构化的数据。
比如,近几年大热的数据湖,就是典型的带有读时建模技术特点的大数据系统。此外,国外知名大数据厂商Splunk 也是读时建模技术的先驱,Splunk 大数据平台因其灵活地处理各种不同格式的数据,收获了很多用户的喜爱。
读时建模技术的优势
具备读时建模技术的系统,相比于对数据ETL之后存储到带有 Schema 的结构化数据库当中的系统,在处理不同格式的数据的场景下,有极大的灵活性。
因为在查询数据的时候,根据查询算法规则将原始数据中的有用信息提取出来,生成字段,不用进行传统的ETL操作,因此,当提取信息的逻辑变化的时候,只需要更新算法,而无须重新导入数据。
该特性使得利用读时建模的系统能够让你把数据先”玩“起来,然后逐步丰富从原始数据中提取的内容和信息,帮助你进一步探寻数据中的规律和使用数据解决问题。
随着业务发展和业务需求变化,不需要重新运行ETL任务,可以通过更新算法的方式获取更多的信息,灵活支撑业务,加快需求落地实现的速度。同时,在业务需求不明朗的情况下,对于”探寻“类任务,可以通过变换对原始数据的分析算法,动态提取需要的信息,研究数据带来的价值和探寻解决问题的可能性。
不论是数据格式变化,或者是数据分析需求变化的时候,在读时建模的系统中,更新数据 Schema 是一个轻量级的操作,可以快速完成。极端情况下,甚至可以在不更新计算算法的时候,完成数据 Schema 的自动更新。例如,在分析Json格式的数据的时候,当Json对象中新增字段的时候,可以不需要更改算法,就直接分析新的数据。
鸿鹄 SQL 的特点
常见的关系型数据库是典型的写时建模的系统,在数据存入数据库的时候需要定义完整清晰的 Schema 信息。鸿鹄 SQL 是构建于鸿鹄读时建模计算引擎基础之上,使用鸿鹄 SQL 分析数据的时候,不需要对原始数据有明确 Schema 定义。 所以,这也是鸿鹄 SQL 和关系型数据库 SQL 产生差异的根本原因。
相比于普通 SQL ,鸿鹄 SQL 有如下两个关键特点:
1、FROM关键字之后跟随的数据集,视图或者表函数,都不需要有严格的 Schema 定义。数据集,视图以及表函数的 Schema,都是在计算任务执行的时候由读时建模引擎动态确定的。引擎会根据存储数据的内容、视图定义的算法逻辑来构建数据的 Schema。
所以,在 SQL 解析的时候,不做 Schema 的校验。例如,对于这样一个 SQL 查询SELECT id, name FROM my_view,在关系型数据库解析 SQL 的时候,会校验视图my_view的 schema 中是否包含名为id和name的两个列。
但是,在鸿鹄 SQL 当中,不会做这样的校验,如果视图在运行时不存在 name 列,那么我们计算结果中将得到一个都是null值的name列。
2、SQL 投影 (Projection)计算中,引用的列的数据类型,是计算任务执行的时候动态确定。因为所有投影字段,都不需要有明确的 Schema 定义,所以具体的这个字段是整数类型还是字符串类型,计算引擎会根据算法规则和原始数据内容,在计算时动态推断和转换。
SQL语法等方面,鸿鹄 SQL 遵循 ANSI 标准,也提供了常见的关键字的支持,例如 SELECT, WHERE, GROUP BY 等;SQL 涉及到的概念方面,鸿鹄 SQL 也和绝大多数数据库保持了一致,例如,窗口函数,聚合函数,表函数,CTE等。
所以,对于已经熟练使用 SQL 的用户,使用鸿鹄 SQL 几乎没有学习成本。对于不熟悉 SQL 的用户,学习鸿鹄 SQL 之后,在日后使用关系型数据库 SQL 的时候,也有帮助。
鸿鹄 SQL 的功能概览
DQL:数据查询语言部分
鸿鹄 SQL 支持以下关键字:
●SELECT: 字段选取和转换
●WHERE: 数据过滤
●GROUP BY:聚合分析
●HAVING:聚合结果过滤
●PARTITION BY:窗口函数
●ORDER BY:按字段排序
●WITH:公共查询表达式(CTE)
●EXISTS:子查询
●JOIN:关联查询
●UNION ALL:查询结果集合并
●APPLY:表函数
●DISTNCT:字段去重
●LIMIT:查询结果集取前若干条
DDL: 数据定义语言部分
●CREATE VIEW:新建视图
●DROP VIEW:删除视图
●CREATE MATERIALIZED VIEW:新建物化视图
●DROP MATERIALIZED VIEW:删除物化视图
●CREATE LOOKUP TABLE:创建查找表
●DROP LOOKUP TABLE:删除查找表
●鸿鹄是一个数据分析系统,SQL 语法中不支持事务处理相关的功能,例如没有 COMMIT, ROLLBACK,TRANSACTION 等关键字的支持。
●鸿鹄目前也不支持使用 SQL 进行权限访问控制的管理,例如,没有 GRANT, REVOKE 关键字的支持。
鸿鹄 SQL 执行的顺序
一个 SQL 查询任务,在鸿鹄计算引擎执行的时候,遵循如下的计算顺序:
在一个 SQL 查询中, FROM 和 SELECT 的步骤是必须存在的。其他的虚线框标识的步骤是可选的,如果在一个 SQL 查询中有使用到相关的计算功能,则遵循图中的计算顺序。
理解 SQL 的计算顺序对于写出正确的 SQL 查询很关键,同时在调试 SQL 查询的时候也需要对 SQL 执行顺序有明确的理解。
相关参考资料