SQL,全称Structured Query Language,是当今使用最广泛的数据查询语言。最初的设计仅仅是适用于RDBMS,可是随着数据底层存储结构设计的大爆发,越来越多的数据存储引擎支持SQL查询。甚至于支持SQL查询几乎可以定义为这个数据存储引擎能否广泛应用于生产环境的一种标准,最典型的案例就是Hive。Elasticsearch和Druid虽然原生不支持,但从官网发布的消息来看,SQL支持正在计划中。
只可惜ANSI针对SQL仅仅是提供了一种标准,数据存储引擎均在此基础上做了不同的发展演化。发展至今,不同引擎的SQL差异化愈发明显,数据分析人员必须学习使用不同的SQL语言来适应不同的数据存储生产环境,这本身就违背了SQL设计的初衷。另一方面来说,不同数据存储引擎间因数据结构的差异,不能将数据放在一起进行计算探索,这也极大的限制了数据分析人员的分析成果可能性。
于是,Quicksql(简称QSQL)诞生啦!
简介
Quicksql旨在成为简单,更安全,更快速的跨数据源统一SQL查询引擎。
它帮助用户减少在使用不同数据引擎时需要的学习成本和切换成本,忽略不同数据引擎底层存储和数据查询方式的差异,使用户仅需要关注查询的业务逻辑和数据本身。对于组织而言,这样的设计可以大幅度提高整体数据分析的效率,降低新员工的培训成本,更快速更高效的帮助组织使用数据促进发展。
实现
Quicksql基于Apache Calcite提供的多数据引擎SQL语义适配功能,基于ANSI发布的SQL 2003标准和用户的使用习惯上,重新定义并扩展部分SQL语义,对用户提供了统一的SQL语言。在内部,Quicksql会根据用户所查询的SQL语句,在原语义的基础上,进行解析转化等操作,最终根据数据引擎特性将用户的查询语义完整地转化为数据引擎可执行的SQL语句。Quicksql还拥有智能选择功能,可以根据该SQL的引擎特性决定最快速最高效的数据查询方式,例如,当Quicksql分析得出查询语句是一个混合查询,它就会自动选择启动集群模式(默认是Spark)进行数据处理。
特点
统一SQL语义
提供统一SQL语言,方便用户学习使用。
混合SQL的支持
在日常工作中,我们发现有很多业务线同事面临需要将Hive的数据连接MySQL的操作等需要,这在传统的SQL查询中是无法实现的。但是Quicksql做到了。用户可以完全忽略掉不同数据引擎的底层存储,对两种或两种以上的引擎进行连接(JOIN)、合并(UNION)等操作,更快速的达到数据分析的结果。
易扩展
Quicksql拥有数据底层存储无关,数据计算引擎无关的特性。也就是说,它可以很方便地扩展多种数据源(Druid、Mongo等),扩展多种计算引擎(Spark、Flink等)。在0.5-release版中,Quicksql重点实现了Hive、MySQL、Elasticsearch的混查,引擎支持JDBC和Spark,后面我们会添加常用的数据存储引擎和计算引擎,也欢迎大家来和我们一起完善构建统一SQL的世界。
架构图
使用
Quicksql现在提供三种对外服务方式:命令行,API和JDBC连接。
命令行
根据Quicksql的Github主页相关说明,用户可以很容易的进行Quicksql的部署。部署完成后,Quicksql提供了脚本模式,支持使用类似 “qsql -e [SQL]” 这样的命令进行数据查询。
API
为方便开发者用户使用,Quicksql提供了一套API方便开发程序调用。与Spark、Storm等现有的引擎类似,Quicksql API在使用中需要先定义环境参数(任务名,执行引擎,查询最大返回条数等),然后进行SQL的查询和任务的提交。关于API的用法详情可以参考Quicksql example。
JDBC
Quicksql还实现了JDBC的接口,用户可以像连接MySQL一样通过JDBC方式连接Quicksql进行数据查询。