阅读154 返回首页    go 阿里云 go 技术社区[云栖]


SQL 概要__SQL_大数据计算服务-阿里云

MaxCompute SQL适用于海量数据(TB级别),实时性要求不高的场合,它的每个作业的准备,提交等阶段要花费较长时间,因此要求每秒处理几千至数万笔事务的业务是不能用 MaxCompute 完成的。

MaxCompute SQL采用的是类似于SQL的语法,可以看作是标准SQL的子集,但不能因此简单的把MaxCompute 等价成一个数据库,它在很多方面并不具备数据库的特征,如事务、主键约束、索引等。目前在 MaxCompute 中允许的最大SQL长度是2MB。

关键字

MaxCompute 将SQL语句的关键字作为保留字。在对表、列或是分区命名时请不要使用,否则会报错。保留字不区分大小写。下面只给出常用的保留字列表,完整的保留字列表请参阅 MaxCompute SQL保留字

  1. % & && ( ) * +
  2. - . / ; < <= <>
  3. = > >= ? ADD ALL ALTER
  4. AND AS ASC BETWEEN BIGINT BOOLEAN BY
  5. CASE CAST COLUMN COMMENT CREATE DESC DISTINCT
  6. DISTRIBUTE DOUBLE DROP ELSE FALSE FROM FULL
  7. GROUP IF IN INSERT INTO IS JOIN
  8. LEFT LIFECYCLE LIKE LIMIT MAPJOIN NOT NULL
  9. ON OR ORDER OUTER OVERWRITE PARTITION RENAME
  10. REPLACE RIGHT RLIKE SELECT SORT STRING TABLE
  11. 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’表示不可以转换,’–’表示不需要转换。

比如:

  1. select cast(user_id as double) as new_id from user;
  2. 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 支持的隐式类型转换规则与显式转换相同:

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’表示不可以转换,’–’表示不需要转换。

常见用法如下:

  1. select user_id+age+'12345',
  2. concat(user_name,user_id,age)
  3. 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, IN)

LIKE及RLIKE的使用方式形如:

  1. source like pattern;
  2. source rlike pattern;

此二者在隐式类型转换中的注意事项:

  • LIKE和RLIKE的source和pattern参数均仅接受string类型;
  • 其他类型不允许参与运算,也不能进行到string类型的隐式类型转换;IN的使用方式形如:
  1. key in (value1, value2, …)

In的隐式转换规则:

  • In右侧的value值列表中的数据类型必须一致;
  • 当key与values之间比较时,若bigint, double, string之间比较,统一转double,若datetime和string之间比较,统一转datetime。除此之外不允许其它类型之间的转换。

算术运算符

算术运算符包括:+, -, * , /, %, +, -,其隐式转换规则:

只有string、bigint、double和Decimal才能参与算术运算。String在参与运算前会进行隐式类型转换到double。Bigint和double共同参与计算时,会将bigint隐式转换为double。日期型和布尔型不允许参与算数运算。

备注:

逻辑运算符

逻辑运算符包括:and, or和not,其隐式转换规则:

  • 只有boolean才能参与逻辑运算。
  • 其他类型不允许参与逻辑运算,也不允许其他类型的隐式类型转换。

备注:

MaxCompute SQL内建函数

MaxCompute SQL提供了大量的系统函数,方便用户对任意行的一列或多列进行计算,输出任意种的数据类型。其隐式转换规则:

  • 在调用函数时,如果输入参数的数据类型与函数定义的参数数据类型不一致,把输入参数的数据类型转换为函数定义的数据类型。
  • 每个ODPS SQL内建函数的参数对于允许的隐式类型转换的要求不同,详见 内建函数 部分的说明。

CASE WHEN

Case when的隐式转换规则:

  • 如果返回类型只有bigint,double,统一转double;
  • 如果返回类型中有string类型,统一转string,如果不能转则报错(如boolean类型);
  • 除此之外不允许其它类型之间的转换;

备注:

  • Case when的详细介绍请参阅 [CASE WHEN表达式]

分区表

MaxCompute SQL支持分区表。指定分区表会对用户带来诸多便利,例如:提高SQL运行效率,减少计费等。在如下场景下使用分区表将会带来较大的收益:

  • 在Select语句的Where条件过滤中使用分区列作为过滤条件;
  1. create table src (key string, value bigint) partitioned by (pt string); -- 目前,MaxCompute 仅承诺String类型分区
  2. select * from src where pt='20151201'; -- 正确使用方式。MaxCompute 在生成查询计划时只会将'20151201'分区的数据纳入输入中
  3. select * from src where pt = 20151201; -- 错误的使用方式。在这样的使用方式下,MaxCompute并不能保障分区过滤机制的有效性。pt是String类型,当String类型与Bigint(20151201)比较时,MaxCompute会将二者转换为Double类型,此时有可能会有精度损失。

与此同时,部分对分区操作的SQL的运行效率则较低,给您带来较高的计费,例如:

对于部分 MaxCompute 操作命令,处理分区表和非分区表时的语法有差别,详细情况请参考DDL语句DML语句 部分的说明 。目前,ODPS分区仅支持string类型,不承诺其他分区类型的正确性,不支持其他任意类型的隐式类型转换。

UNION ALL

参与 UNION ALL 运算的所有列的数据类型、列个数、列名称必须完全一致,否则抛异常。

String类型与Datetime类型之间的转换

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的格式。

类似于下面的转换尝试,将会失败导致异常,例如:

  1. cast("2013/12/31 02/34/34" as datetime)
  2. cast("20131231023434" as datetime)
  3. cast("2013-12-31 2:34:34" as datetime)

值得注意的是,”dd”部分的阈值上限取决于月份实际拥有的天数,如果超出对应月份实际拥有的天数,将会导致异常退出,例如:

  1. cast("2013-02-29 12:12:12" as datetime) -- 异常返回,2013年2月没有29日
  2. cast("2013-11-31 12:12:12" as datetime) -- 异常返回,2013年11月没有31日

MaxCompute 提供了to_date函数,用以将不满足日期格式的string类型数据转换为datetime类型。详细信息请参阅 TO_DATE

最后更新:2016-11-23 17:16:04

  上一篇:go 多线程下载示例__SDK示例_批量数据通道_大数据计算服务-阿里云
  下一篇:go 运算符__SQL_大数据计算服务-阿里云