MaxCompute SQL 适用于海量数据(GB、TB、EB 级别),离线批量计算的场合。MaxCompute 作业提交后会有几十秒到数分钟不等的排队调度,所以适合处理跑批作业,一次作业批量处理海量数据,不适合直接对接需要每秒处理几千至数万笔事务的前台业务系统。
MaxCompute SQL 采用的是类似于 SQL 的语法,可以看作是标准 SQL 的子集,但不能因此简单的把 MaxCompute 等价成一个数据库,它在很多方面并不具备数据库的特征,如事务、主键约束、索引等(更多差异请单击进入查看)。目前在 MaxCompute 中允许的最大 SQL 长度是 2MB。
MaxCompute 将 SQL 语句的关键字作为保留字。在对表、列或是分区命名时如若使用关键字,需给关键字加``
符号进行转义,否则会报错。保留字不区分大小写。下面只给出常用的保留字列表,完整的保留字列表请参阅 MaxCompute SQL 保留字。
% & && ( ) * +
- . / ; < <= <>
= > >= ? ADD ALL ALTER
AND AS ASC BETWEEN BIGINT BOOLEAN BY
CASE CAST COLUMN COMMENT CREATE DESC DISTINCT
DISTRIBUTE DOUBLE DROP ELSE FALSE FROM FULL
GROUP IF IN INSERT INTO IS JOIN
LEFT LIFECYCLE LIKE LIMIT MAPJOIN NOT NULL
ON OR ORDER OUTER OVERWRITE PARTITION RENAME
REPLACE RIGHT RLIKE SELECT SORT STRING TABLE
THEN TOUCH TRUE UNION VIEW WHEN WHERE
MaxCompute SQL 允许数据类型之间的转换,类型转换方式包括:显式类型转换及隐式类型转换。
显式类型转换是用 cast 将一种数据类型的值转换为另一种类型的值的行为,在 MaxCompute SQL 中支持的显式类型转换如下:
From/To | Bigint | Double | String | Datetime | Boolean | Decimal |
---|---|---|---|---|---|---|
Bigint | – | Y | Y | N | N | Y |
Double | Y | – | Y | N | N | Y |
String | Y | Y | – | Y | N | Y |
Datetime | N | N | Y | – | N | N |
Boolean | N | N | N | N | – | N |
Decimal | Y | Y | Y | N | N | - |
其中,Y 表示可以转换,N 表示不可以转换,– 表示不需要转换。
比如:
select cast(user_id as double) as new_id from user;
select cast('2015-10-01 00:00:00' as datetime) as new_date from user;
备注:
- 将 double 类型转为 bigint 类型时,小数部分会被截断,例如:cast(1.6 as bigint) = 1;
- 满足 double 格式的 string 类型转换为 bigint 时,会先将 string 转换为 double,再将 double 转换为 bigint,因此,小数部分会被截断,例如 cast(“1.6” as bigint) = 1;
- 满足 bigint 格式的 string 类型可以被转换为 double 类型,小数点后保留一位,例如:cast(“1” as double) = 1.0;
- 不支持的显式类型转换会导致异常;
- 如果在执行时转换失败,报错退出;
- 日期类型转换时采用默认格式 yyyy-mm-dd hh:mi:ss,详细说明信息请参考String类型与Datetime类型之间的转换;
- 部分类型之间不可以通过显式的类型转换,但可以通过 SQL 内建函数进行转换,例如:从 boolean 类型转换到 string 类型,可使用函数 to_char,详细介绍请参见: TO_CHAR ,而 to_date 函数同样支持从 string 类型到 datetime 类型的转换,详细介绍请参见: TO_DATE ;
- 关于 cast 的介绍请参见: CAST ;
- DECIMAL 超出值域,CAST STRING TO DECIMAL 可能会出现最高位溢出报错,最低位溢出截断等情况。
隐式类型转换是指在运行时,由 MaxCompute 依据上下文使用环境及类型转换规则自动进行的类型转换。MaxCompute 支持的隐式类型转换规则如下所示:
boolean | tinyint | smallint | int | bigint | float | double | decimal | string | varchar | timestamp | binary | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
boolean to | T | F | F | F | F | F | F | F | F | F | F | F |
tinyint to | F | T | T | T | T | T | T | T | T | T | F | F |
smallint to | F | F | T | T | T | T | T | T | T | T | F | F |
int to | F | F | F | T | T | T | T | T | T | T | F | F |
bigint to | F | F | F | F | T | T | T | T | T | T | F | F |
float to | F | F | F | F | F | T | T | T | T | T | F | F |
double to | F | F | F | F | F | F | T | T | T | T | F | F |
decimal to | F | F | F | F | F | F | F | T | T | T | F | F |
string to | F | F | F | F | F | F | T | T | T | T | F | F |
varchar to | F | F | F | F | F | F | T | T | T | T | F | F |
timestamp to | F | F | F | F | F | F | F | F | T | T | T | F |
binary to | F | F | F | F | F | F | F | F | F | F | F | T |
其中,T 表示可以转换,F 表示不可以转换。
注释:
常见用法如下:
select user_id+age+'12345',
concat(user_name,user_id,age)
from user;
备注:
- 不支持的隐式类型转换会导致异常;
- 如果在执行时转换失败,也会导致异常;
- 由于隐式类型转换是 MaxCompute 依据上下文使用环境自动进行的类型转换,因此,我们推荐在类型不匹配时显式的用 cast 进行转换;
- 隐式类型转换规则是有发生作用域的。在某些作用域中,只有一部分规则可以生效。详细信息请参考隐式类型转换的作用域;
关系运算符包括:=, <>, <, <=, >, >=, IS NULL, IS NOT NULL, LIKE, RLIKE 和 IN。由于 LIKE, RLIKE 和 IN 的隐式类型转换规则不同于其他关系运算符,将单独拿出章节对这三种关系运算符做出说明。本小节的说明不包含这三种特殊的关系运算符。当不同类型的数据共同参与关系运算时,按照下述原则进行隐式类型转换。
From/To | Bigint | Double | String | Datetime | Boolean | Decimal |
---|---|---|---|---|---|---|
Bigint | – | Double | Double | N | N | Decimal |
Double | Double | – | Double | N | N | Decimal |
String | Double | Double | – | Datetime | N | Decimal |
Datetime | N | N | Datetime | – | N | N |
Boolean | N | N | N | N | – | N |
Decimal | Decimal | Decimal | Decimal | N | N | - |
备注:
- 如果待比较的两个类型间不能进行隐式类型转换,则该关系运算不能完成,报错退出;
- 关系运算符介绍,请参见:关系操作符 ;
LIKE 及 RLIKE 的使用方式形如:
source like pattern;
source rlike pattern;
二者在隐式类型转换中的注意事项:
IN 的使用方式形如:
key in (value1, value2, …)
In 的隐式转换规则:
算术运算符包括:+, -, * , /, %, +, -,其隐式转换规则:
只有 string、bigint、double 和 Decimal 才能参与算术运算。String 在参与运算前会进行隐式类型转换到 double。Bigint 和 double 共同参与计算时,会将 bigint 隐式转换为 double。日期型和布尔型不允许参与算数运算。
备注:
- 算术运算符的相关章节 算术操作符。
逻辑运算符包括:and, or 和 not,其隐式转换规则:
备注:
- 逻辑运算符的相关章节 逻辑操作符。
MaxCompute SQL 提供了大量的系统函数,方便用户对任意行的一列或多列进行计算,输出任意种的数据类型。其隐式转换规则:
Case when 的隐式转换规则:
备注:
- Case when 的详细介绍请参见:[CASE WHEN 表达式]。
MaxCompute SQL 支持分区表。指定分区表会对用户带来诸多便利,例如:提高 SQL 运行效率,减少计费等。关于分区介绍请参见: 基本概念-分区。
参与 UNION ALL 运算的所有列的数据类型、列个数、列名称必须完全一致,否则抛异常。
MaxCompute 支持 string 类型和 datetime 类型之间的相互转换。转换时使用的格式为 yyyy-mm-dd hh:mi:ss,其中:
单位 | 字符串(忽略大小写) | 有效值域 |
---|---|---|
年 | yyyy | 0001 ~ 9999 |
月 | mm | 01 ~ 12 |
日 | dd | 01 ~ 28,29,30,31 |
时 | hh | 00 ~ 23 |
分 | mi | 00 ~ 59 |
秒 | ss | 00 ~ 59 |
备注:
- 各个单位的值域中,如果首位为 0,不可省略,例如:”2014-1-9 12:12:12”就是非法的 datetime 格式,无法从这个 string 类型数据转换为 datetime 类型,必须写为”2014-01-09 12:12:12”。
- 只有符合上述格式描述的 string 类型才能够转换为 datetime 类型,例如:cast(“2013-12-31 02:34:34” as datetime),将会把 string 类型 ”2013-12-31 02:34:34” 转换为 datetime 类型。同理,datetime 转换为 string 时,默认转换为yyyy-mm-dd hh:mi:ss的格式。
类似于下面的转换尝试,将会失败导致异常,例如:
cast("2013/12/31 02/34/34" as datetime)
cast("20131231023434" as datetime)
cast("2013-12-31 2:34:34" as datetime)
值得注意的是,“dd”部分的阈值上限取决于月份实际拥有的天数,如果超出对应月份实际拥有的天数,将会导致异常退出,例如:
cast("2013-02-29 12:12:12" as datetime) -- 异常返回,2013年2月没有29日
cast("2013-11-31 12:12:12" as datetime) -- 异常返回,2013年11月没有31日