本文档详细介绍了Redshift和MaxCompute之间SQL语法的异同。这篇文档有助于加快sql任务迁移到MaxCompute。由于Redshift和MaxCompute之间语法存在很多差异,因此我们需要修改Redshift上编写的脚本,然后才能在MaxCompute中使用,因为服务之间的SQL方言不同。
2.迁移前RedShift于MaxCompute的各项对比差异
2.1.1数据类型对比及类型转化
* 支持复杂数据类型(array,map,struct)
* 支持Java、Python语言的UDF/UDAF/UDTF
* 语法:Values、CTE、SEMIJOIN、FROM倒
装、Subquery Operations 、 Set
Operations(UNION /INTERSECT /MINUS)、
SELECT TRANSFORM 、User Defined Type、
GROUPING SET(CUBE/rollup/GROUPING
SET)、脚本运行模式、参数化视图
* 支持外表(外部数据源+StorageHandler,支
持非结构化数据)
3、RedShift到MaxCompute迁移工具介绍
从数据库表导入到 Amazon S3
https://docs.aws.amazon.com/zh_cn/redshift/latest/dg/c_unloading_data.html?spm=a2c4g.11186623.0.0.50d3358eWX84rm
在线迁移上云服务
https://help.aliyun.com/document_detail/94352.html
将数据从OSS迁移至同区域的MaxCompute项目load命令
https://help.aliyun.com/document_detail/157418.htm?spm=a2c4g.11186623.0.0.50d3358eWX84rm#concept-2419019
语法校验工具二选一
MaxCompute studio
https://help.aliyun.com/document_detail/50889.html
DataWorks sql节点
https://help.aliyun.com/document_detail/137510.html
4、迁移整体方案
数据库迁移主要包含以下内容
迁移实施计划:
用户根据自身现有 RedShift数据量、QPS、TPS 等性能指标、高可用需求和未来业务增长需求,制定合理化的迁移方案。
5.3. 资源规划
用户需要准备好 MaxCompute 的相关环境,同时获取到对应需要使用的迁移工具。迁移工具的相关内容请参考《 RedShift到MaxCompute迁移工具介绍 》 章节。
5.4. 改造及测试验证
5.4.1. 改造
迁移工具可以利用MaxCompute studio(或者DataWorks新建sql节点)客户端语法校验,新建一个sql文件,如图不支持的语法会报红
MaxCompute Studio安装文档
https://help.aliyun.com/document_detail/50889.html
5.4.1.1. 建表
在RedShift中获取表列表和表字段定义,按照Maxcompute支持的字段值进行转换,对于有update和delete语句的表必须建成Transactional表
类型转化参考《数据类型对比及类型转化》章节
--创建新表。
create [external] table [if not exists]
[( [not null] [default ] [comment ], ...)]
[comment ]
[partitioned by ( [comment ], ...)]
--用于创建聚簇表时设置表的Shuffle和Sort属性。
[clustered by | range clustered by ( [, , ...]) [sorted by ( [asc | desc] [, [asc | desc] ...])] into buckets]
--仅限外部表。
[stored by StorageHandler]
--仅限外部表。
[with serdeproperties (options)]
--仅限外部表。
[location ]
--指定表为Transactional表,后续可以对该表执行更新或删除表数据操作,但是Transactional表有部分使用限制,请根据需求创建。
[tblproperties("transactional"="true")]
[lifecycle ];
--基于已存在的表创建新表并复制数据,但不复制分区属性。
create table [if not exists] [lifecycle ] as ;
--基于已存在的表创建具备相同结构的新表但不复制数据。
create table [if not exists] like [lifecycle ];
⚫ 表名与列名均对大小写不敏感。
⚫ 在创建表时,如果不指定 if not exists选项而存在同名表,则返回报错;若指定此选项,则无论是否存在同名表,即使原表结构与要创建的目标表结构不一致, 均返回成功。已存在的同名表的元信息不会被改动。
⚫ 表名、列名中不能有特殊字符,只能用英文的 a-z、A-Z 及数字和下划线(_),
且以字母开头,名称的长度不超过 128 字节。
⚫tblproperties("transactional"="true"):可选(有update和delete语句必须设置)。设置表为Transactional表。后续可以对Transactional表执行update、delete操作实现行级更新或删除数据。更多信息,请参见
更新或删除数据(UPDATE | DELETE)
。
⚫ Partitioned by 指定表的分区字段,目前仅支持 string类型。分区值不可以有双字节字符(如中文),必须是以英文字母 a-z、A-Z开始后可跟字母数字,名称的长度不超过 128 字节。允许的字符包括:空格、冒号(:)、下划线(_)、美元符$)、井号(#)、点(.)、感叹号(!)和@,出现其他字符行为未定义, 例如:“\t”、“\n”、“/”等。当利用分区字段对表进行分区时,新增分区、更新分区内数据和读取分区数据均不需要做全表扫描,可以提高处理效率。
⚫ 注释内容是长度不超过 1024 字节的有效字符串。
⚫ lifecycle 指明此表的生命周期,单位:天。create table like 语句不会复制源表
的生命周期属性。
⚫ 理论上源表分区最多只能 6 级,但考虑极限存储的分区膨胀方式,请尽可能少用
⚫ 一个表允许的分区个数支持按照具体的 project 配置,默认 60000 个。
⚫ 在create table ... as select ...语句中,如果在 select 子句中使用常量作为列的
值,建议指定列的名字。
⚫ 如果希望源表和目标表具有相同的表结构,可以尝试使用 create table ... like 操
5.4.1.1.1建表具体案例
列名双引号要去掉
形如BIGINT primary key identity(1,1)主键⾃增列要去掉,只保留默认值default 1
numeric数据类型要转为decimal
形如::character varying,'1900/01/01'::text这种,两个冒号及后⾯内容要删除,MC不⽀持
形如"n_car_no" numeric DEFAULT -1::numeric,MC不⽀持默认值为-1,需要去掉
形如"ts_req_time" timestamp without time zone DEFAULT to_timestamp('1900/00/00 00:00:00'::text, 'YYYY-MM-DD HH24:MI:SS.MS'::text),需要去掉timezone,并改为timestamp DEFAULT timestamp "1900-01-01 00:00:00"
形如INTERLEAVED SORTKEY(vc_trans_id),MC不⽀持交错排序列功能,可以考虑替换为 zorder。
MC不⽀持时区time zone,有关time zone的需要删除。
物化视图修改去掉 AUTO REFRESH YES,同时MaxCompute物化视图不支持窗口函数
5.4.1.2. SQL 迁移
SQL 迁移实际上就是根据 Oracle 和MaxCompute 两者间 SQL 的差异进行转化,将RedShift中的 SQL 转化成 MaxCompute 中的 SQL,从而使 SQL 可用。具体的 SQL间差异请参考《迁移前RedShift于MaxCompute的各项对比差异》 章节中的相关内容
5.4.1.2.1 SQL 迁移 具体案例
DML语句
1.执行updae或者delet的语句需要创建事务表("transactional"="true")
2. 形如COMMENT ON column atzc_dev_dw.t_com_fact_auto_pay_gw_trans_pay_gw."n_trans_amt" is 'dml';给列添加 注释,需要改为MC⽀持的语法alter table change column comment '';
DQL语句
https://help.aliyun.com/document_detail/181920.html
5.4.3. 测试验证
目前RedShift到MaxCompute 迁移的数据测试验证工作,还没有工具可以支持,需要
自行编写脚本工具完成,常用校验方案有如下几种:
⚫ 表结构校验,从 RedShift和MaxCompute 分别导出数据表列及类型定义后计算
md5 进行校验
⚫ 数据表行数比对,执行 SQL 语句分别在 RedShift和MaxCompute 统计相同表的
数据行数进行逐行比对
⚫ 数据全量校验,一般用于核心表且数据量较小的校验场景,导出全量数据计算
md5 进行校验,或全量数据分段计算 md5 进行校验
⚫ 数据抽样校验,一般用于核心大表的数据校验场景,按一定抽样规则从源和目标
抽取数据进行校验。