华为云DWS与阿里云ADB(MySQL)的差异总结
在线上,我们DWS(数据仓库服务)与ADB for MySQL有非常多的差异,将目前发现的差异总结如下,如有遗漏,欢迎大家补充。
一、总体结构的差异
JDBC需要连接到实例上,使用库名.表名来进行表数据的增删改查等操作。
由此可见,ADB for MySQL中实例对应DWS中的数据库,其数据库对应DWS中的模式(schema),同样,在ADB中可以使用库名.表名的方式进行跨库访问(类似于跨schema访问)。
二、数据类型的差异
ADB(MySQL)中大部分数据类型与DWS是一致的,如VARCHAR、int、bigint、decimal等,但有如下几个数据类型需要大家注意:
1.datetime与timestamp
在ADB(MySQL)中datetime是没有时区的时间戳,而timestamp是带时区的时间戳,因此,在转换成DWS中的数据类型时,datetime需要转为timestamp without time zone,timestamp转为timestamp with time zone;
2.tinyint
DWS与ADB中均存在tinyint这种数据类型,但是,在ADB中其范围是 -128~127,而DWS中为0~255,因此,ADB中的tinyint需要转为DWS中smallint,或int;
三、常用函数的差异
ADB中的日期处理函数与DWS中完全不一致,在语法改造过程中需要格外的注意。
日期的加减,在ADB中有两个不同函数,分别为date_add及date_sub,DWS中可直接改为加减号,但是有一点大家要注意,ADB中INTERVAL后是可以不加单引号的,而且其数值可以是一个字段名。
如下,select DATE_ADD(NOW(),INTERVAL col1 DAY) from table1;
而且,在ADB中INTERVAL 后面的小数会自动截取整数位,这点也是与DWS有很大差距的,这种语法一样但是结果不同的差异,大家一定要注意。
此外,字符与日期之间的相互转化,ADB中为date_format(now(),'%Y%m%d')及str_to_date('20201127193000','%Y%m%d%H%i%s'),
这里有一点需要注意,to_date这个函数在MySQL兼容模式下,其输出为日期,而不是时间戳。
例如:to_date('20201127193000','yyyymmddhh24miss'),其结果为 2020-11-27,因此在做函数转化的时候,需要将str_to_date改为to_timestamp而不是to_date。
其他一些ADB特有的函数,如ifnull、if、max_pt等,都需要做相应的转换
四、其他
ADB(MySQL)与DWS的差异当然不仅仅这些,这里只是简单列举了一些常见的、容易出问题的地方供大家参考,此外还有以下几点需要注意:
1、ADB中联合主键中的某一个字段可以为空值。若需要从ADB中同步数据时,如果报错信息是违反非空约束,那除了字段与ADB没有对齐之外,还有一种可能就是因为联合主键中出现了空值。此时,可以将主键改为唯一索引来规避此问题。
2、ADB中如果没有指定主键,会自动建一个`__adb_auto_id__` bigint AUTO_INCREMENT的自增序列作为主键,DWS中需要改成__adb_auto_id__ bigserial。
在使用CDM从ADB同步数据时,该字段是无法默认出现的,需要在CDM中手工添加该字段的映射关系,或去掉该字段映射,使用DWS的默认自增序列。
3、ADB中的replace into需要改为merge into,如果是调度周期比较短或者更新表数据量很大,需要重点关注,可以将merge into 改为select * from a union all select b.* from b left join a on b.id =a.id where a.id is null(a是源表,b是目标表)
4、分区
ADB中可以支持overwrite一个分区的数据,而DWS不支持,因此,在进行语法改造的时候要提高警惕,不要把所有的overwrite都复制过来,需要先删除当前分区的数据,再插入新的数据。
- 点赞
- 收藏
- 关注作者
评论(0)