常用的存储计算引擎包括 MYSQL等,而他们的SQL之间存在较大的差距。这对业务调整后进行数据引擎的迁移、数据建模、查询的SQL解析等都带来了极大的挑战。
Unified SQL 的设计目标是为了消除各引擎SQL之间的差异,提供一致的访问方式。在语法、函数(包括函数名、参数以及语义)、数据类型上做到统一。
这里简单列举几个引擎的不同之处来直观感受一下。
MySQL | Hive | ElasticSearch | |
---|---|---|---|
标识符 | 反引号 | 反引号 | 双引号 |
WHERE中引用别名 | 不可以 | 可以 | 可以 |
函数: 求百分位 | 不支持 | percentile_approx(salary, array(0.95))[0] | PERCENTILE(salary, 95) |
函数: 随机值 | rand() => 0-1的浮点数 | rand() => 0-1的浮点数 | random(seed) => 0-1的浮点数 |
数据类型 | BIGINT/VARCHAR/DECIMAL等 | bigint/string/decimal等 | long/keyword/double等 |
类型转换 | cast(field as BIGINT) | cast(field as bigint) | field::long |
函数名大小写敏感 | 不敏感 | 不敏感 | 不敏感 |
字符串常量 | 单引号/双引号 | 单引号 | 单引号 |
子查询必须指定别名 | 是 | 否 | 否 |
各引擎的 SQL 还存在很多细节部分的差异。Unified SQL 对这些差异尽量的进行了抹除,提供语法和语义一致的SQL体验。
Unified SQL | |
---|---|
标识符 | 反引号 |
WHERE中引用别名 | 可以 |
函数: 求百分位 | quantile(salary, 0.95) |
函数: 随机值 | rand() => int64 |
数据类型 | string/float/int/bool/date/datetime/array/map |
类型转换 | cast(field as float) |
函数名大小写敏感 | 不敏感 |
字符串常量 | 单引号/双引号 |
子查询必须指定别名 | 否 |