RedShift 到 MaxCompute 迁移实践指导

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值