1.概要
本文档详细介绍了Redshift和MaxCompute之间SQL语法的异同。这篇文档有助于加快sql任务迁移到MaxCompute。由于Redshift和MaxCompute之间语法存在很多差异,因此我们需要修改Redshift上编写的脚本,然后才能在MaxCompute中使用,因为服务之间的SQL方言不同。
2.迁移前RedShift于MaxCompute的各项对比差异
2.1.1数据类型对比及类型转化
类别 |
MaxCompute |
建议转化成MaxCompute类型 |
Redshift |
|
数值类型 |
smallint |
Y |
Y |
Y |
integer |
N |
int |
Y |
|
bigint |
Y |
int |
Y |
|
decimal |
Y |
Y |
Y |
|
numeric |
N |
decimal |
Y |
|
real |
N |
float |
Y |
|
double |
Y |
Y |
Y |
|
float |
Y |
float |
Y |
|
TINYINT |
Y |
smallint |
N |
|
字符类型 |
varchar(n) |
Y |
Y |
Y |
char(n) |
Y |
Y |
Y |
|
STRING |
Y |
|||
text |
N |
string |
Y |
|
日期 |
TIMESTAMP |
Y |
Y |
Y |
TIMESTAMPTZ |
N |
Y |
||
DATE |
Y |
Y |
Y |
|
TIME |
N |
Y |
||
DateTime |
Y |
N |
||
boolean 数据类型 |
boolean |
Y |
Y |
Y |
复杂数据类型 |
ARRAY |
Y |
Y |
N |
MAP |
Y |
Y |
N |
|
STRUCT |
Y |
Y |
N |
|
HLLSketch |
N |
Y |
MaxCompoute数据类型参考https://help.aliyun.com/document_detail/159541.html
2.1.2语法对比
MaxCompute没有schenma、group、库、存储过程的概念。只有project、表、分区,MaxCompute建表时没有自增序列 外键等,不支持指定编码默认utf-8,内部表不支持指定存储格式默认Aliorc
主要区别 |
|
表结构 |
不能修改分区列列名,只能修改分区列对应的值。 |
支持增加列,但是不支持删除列以及修改列的数据类 型。 |
|
SQL 常见问题 |
INSERT 语法上最直观的区别是:Insert into/overwrite 后面 有个关键字 Table。 |
数据插入表的字段映射不是根据 Select 的别名做的,而 是根据 Select 的字段的顺序和表里的字段的顺序 |
|
UPDATE/DELETE |
只有事务表支持UPDATE/DELETE |
join |
Join 必须要用 on 设置关联条件,不支持笛卡尔积 |
触发器 |
不支持触发器、 |
创建外部函数 |
maxCompute没有外部函数 |
精度 |
DOUBLE 类型存在精度问题。 不建议在关联时候进行直接等号关联两 个 DOUBLE字段,建议把两个数做减 法,如果差距小于一个预设的值就认为 是相同,例如 abs(a1- a2) < 0.000000001。 目前产品上已经支持高精度的类型 DECIMAL。 |
日期 |
MaxCompute主要的日期类型是datetime(格式yyyy-mm-dd hh:mi:ss) timestamp date,datetime支持的内建函数更加丰富,建议日期转成datetime做运算,日期函数链接 |
存储过程 |
使用MaxCompute的pyodps修改 |
物化视图 |
要更新物化化视图中的数据,MaxCompute只能手动更新,不支持自动更新 |
redshift 支持在select语句中引用别名如 select money/100 as a ,round(money/100,3) from table |
MaxCompute修改 select money/100 as a ,round(a,3) from table |
2.1.3复合表达式
MaxCompute |
REDAHIFT |
|
+、- |
Y |
Y |
^、|/、||/ |
Y |
Y |
*、/、% |
Y |
Y |
@ |
N |
Y |
&、|、 |
Y |
Y |
|| |
Y |
Y |
#、~、<<、>> |
使用shift函数替换 |
Y |
2.1.4条件比较
MaxCompute |
REDAHIFT |
|
<> 或 != |
Y |
Y |
like |
Y |
Y |
BETWEEN expression AND |
Y |
Y |
IS [ NOT ] NULL |
Y |
Y |
EXISTS |
Y |
Y |
POSIX 运算符 |
N |
Y |
SIMILAR TO |
N |
Y |
IN |
Y |
Y |
正则 ~ |
Rlike |
Y |
~~ |
like |
Y |
2.1.5DDL语法
主要差异:
1.MaxCompute不支持主键自增和PRIMARY KEY
2.指定默认值default]不支持使用函数
3.decimal指定默认值不支持-1
语法 |
MaxCompute |
REDSHIFT |
CREATE TABLE—PRIMARY KEY |
N |
Y |
CREATE TABLE—NOT NULL |
Y |
Y |
CREATE TABLE—CLUSTER BY |
Y |
N |
CREATE TABLE—EXTERNAL TABLE |
Y(OSS, OTS, TDDL) |
N |
CREATE TABLE—TEMPORARY TABLE |
N |
Y |
table_attributes |
N(Mc内部表不需要添加属性) |
Y |
CREATE TABLE—AS |
Y |
Y |
create materialized view |
Y |
Y |
2.1.6DML语法差异
语法 |
MaxCompute |
REDSHIFT |
CTE |
Y |
Y |
SELECT—into |
N |
Y |
SELECT—recursive CTE |
N |
Y |
SELECT—GROUP BY ROLL UP |
Y |
N |
SELECT—GROUPING SET |
Y |
Y |
SELECT—IMPLICT JOIN |
Y |
Y |
SEMI JOIN |
Y |
N |
SELEC TRANSFROM |
Y |
N |
SELECT—corelated subquery |
Y |
Y |
LATERAL VIEW |
Y |
Y |
SET OPERATOR—UNION (disintct) |
Y |
Y |
SET OPERATOR—INTERSECT |
Y |
Y |
SET OPERATOR—MINUS/EXCEPT |
Y |
Y |
INSERT INTO ... VALUES |
Y |
Y |
INSERT INTO (ColumnList) |
Y |
Y |
UPDATE … WHERE |
Y(事务表支持) |
Y |
DELETE … WHERE |
Y(事务表支持) |
Y |
ANALYTIC—reusable WINDOWING CLUSUE |
Y |
Y |
ANALYTIC—CURRENT ROW |
Y |
Y |
ANALYTIC—UNBOUNDED |
Y |
Y |
ANALYTIC—RANGE … |
Y |
Y |
WHILE DO |
N |
Y |
VIEW WITH PARAMETERS |
Y |
N |
select * into |
N |
Y |
2.1.7内建函数对比
其他未列出的redshift函数不支持。
函数类型 |
MaxCompute |
POSTGRESQL |
在MaxCompute SQL中是否支持分区剪裁 |
日期函数 |
无 |
ADD_MES |
|
无 |
CONVERT_TIMEZONE |
||
无 |
DATE_CMP_TIMESTAMP |
||
无 |
DATE_CMP_TIMESTAMPTZ |
||
无 |
DATE_PART_YEAR |
||
无 |
DATE_CMP |
||
无 |
INTERVAL_CMP |
||
无 |
+ |
||
无 |
SYSDATE |
||
无 |
TIMEOFDAY |
||
无 |
TIMESTAMP_CMP |
||
无 |
TIMESTAMP_CMP_DATE |
||
无 |
TIMESTAMP_CMP_TIMESTAMPTZ |
||
无 |
TIMESTAMPTZ_CMP |
||
无 |
TIMESTAMPTZ_CMP_DATE |
||
无 |