
如何从Teradata迁移到Greenplum(下篇)
在如何从Teradata迁移到Greenplum(上篇)中,向大家介绍了Teradata产品和用户面临的问题、从Teradata迁移到Greenplum的可行性以及如何从Teradata迁移到Greenplum的部分内容,今天将接着和大家分享如何从Teradata迁移到Greenplum的具体内容。
03数据操作语句(DML)转换
1. 关键字转换
在Teradata中,SELECT关键字可以简写为SEL,而在Greenplum中不支持这种简写。转换规则如下:把SEL替换为标准关键字写法SELECT。
注意:该转换不建议全局替换,因为有可能字段名为SEL,因此需要手动搜索脚本进行转换。
2. 别名关键字转换
在Teradata中,字段的别名除了可以通过AS子句指定外,还可以通过NAMED子句指定;而在Greenplum中,不支持NAMED子句,因此,需要进行转换。
注意:该转换不建议全局替换,因为有可能字段名为NAMED,因此需要手动搜索脚本进行转换。
3. 子查询别名转换
在Teradata中子查询不需要指定别名,在Greenplum中子查询需要给予别名。转换规则如下:
转换为:
注意:该转换需要手动搜索脚本进行转换。
4. 字段别名转换
在Teradata中,字段引用别名后,直接可以引用别名进行其他操作。但是,Greenplum不支持在定义字段别名后,直接通过别名对字段进行其他操作。只能通过嵌套子查询的方式进行转换。
转换为:
举例:
注意:该转换需要手动搜索脚本进行转换。
5. 调用函数区别
在查询中调用函数,绝大多数的Teradata支持的标准化函数Greenplum都支持。对于部分Teradata特有的函数,Greenplum虽然没有相同的函数名,但是有相应的函数或者解决方式,请参考后面04 函数转换的内容进行相应转换。
注意:该转换需要手动搜索脚本进行转换。
6. Delete
(1)在不关联其他表,本地根据条件删除记录时,Teradata与Greenplum的语法相同,无须转换;需要关联其他表删除符合条件的记录时,Teradata与Greenplum如果使用子查询的方式,则语法相同;如果通过直接连接的方式,则语法不同,需要进行相应的转换。Greenplum从目标表删除符合条件记录语句的语法如下:
其中:
- table:需要删除记录的目标表名。
- alias:需要删除记录的目标表名的别名。
- usinglist:关联其他表筛选出所要删除记录的子集。
- condition:筛选出所要删除记录的条件。
转换规则为:子查询的关联方式无须转换,通过表连接的方式,Greenplum需要通过USING关键字来申明连接表表名。转换示例如下:
(2)在Teradata中,删除所有数据可使用DELETE FORM TABLE,该方式在Greenplum中是不推荐。Greenplum采用TRUNCATE的方式来完成对整表的删除,语法如下:
注意:该转换需要手动搜索脚本进行手工转换。
7. Update
Teradata数据库的UPDATE操作与Greenplum基本相同,但是关联表进行更新时,Teradata的FROM子句在前,而SET子句在后;而Greenplum刚好相反,且Teradata需要在FROM子句声明更新表及被关联表,Greenplum只需要声明被关联表,更新表则在UPDATE关键字后面直接申明,如下图所示:
注意:该转换需要手动搜索脚本进行转换。
8. Insert
Teradata与Greenplum在INSERT操作语法上没有任何区别,其中Teradata的INSERT-SELECT方式在Greenplum中也支持,无须进行转换。
04函数转换
1.Teradata与Greenplum函数转换规则
Teradata与Greenplum的函数转换规则如下表所示。
2.函数转换示例
(1)QUALIFY 函数
将QUALIFY ROW_NUMBER() OVER () =1 语法修改为下图所示的形式。
(2)CHAR函数
在Greenplum数据库部署CHAR函数,函数定义如下:
(3)CHAR_CHN函数
在Greenplum数据库部署CHAR_CHN函数,函数定义如下:
(4)ZEROIFNULL函数
在Greenplum数据库部署ZEROIFNULL函数,函数定义如下:
(5)其他转换
Teradata和Greenplum的其他转换如下表所示。
(6)数据加载转换
Teradata和Greenplum数据加载比较如下表所示。
Greenplum有两种加载数据工具,包括外部表或者COPY工具。一般来说,如果加载数据量较小时,Greenplum推荐使用COPY工具;但是如果批量数据或者数据量较大时,推荐使用外部表的模式,因为外部表的模式为通过节点并行加载,而COPY则是通过Master主机非并行加载,外部表的加载速度比COPY快N倍。
05ETL应用工具连接转换
1. 在Perl中通过PSQL命令连接数据库
在Perl中通过PSQL命令连接数据库的方法如:
2. 在Perl中通过DBI连接数据库
在Perl中通过DBI连接数据库的方法如下:
3. 基于Perl PSQL连接数据库函数
基于Perl PSQL连接数据库函数的方法如下:
4. 基于Perl DBI连接数据库函数
基于Perl DBI连接数据库函数的方法如下:
06其他应用接口迁移
Greenplum支持使用标准数据库应用接口。例如 ODBC、JDBC 的客户端程序,Perl DBI及Python DBI可以通过配置的方式连接到 Greenplum。常用应用接口如下图所示:
如果是ODBC、JDBC 的客户端程序,那么可通过常规配置连接Greenplum数据库。
通过JDBC连接Greenplum的示例代码如下,可以直接使用postgresql最新版本的jdbc驱动。由于Greenplum中执行的大多是较为复杂的SQL,SQL解析的时间基本上可以忽略,建议在配置JDBC连接时将preferQueryMode设置为simple,强制每次查询进行解析和重新生成执行计划,避免执行计划出错。
04特殊场景
在Teradata中,可以通过声明表的类型为set,在数据加载过程中自动去掉重复记录,在Greenplum中也可以实现同样的功能。下面介绍两种方案。
01事前微批去重
通过在heap表上创建主键索引,可以在数据加载过程中,利用主键进行去重。目前,Greenplum还不支持INSERT ON CONFLICT 语法,但可以通过函数实现同样的功能。在数据通过外部表往目标表导入,当违反唯一性约束时,通过join的方式找出非重复记录插入目标表。具体函数代码如下:
注意:这种方式适用于对数据质量要求比较高,要求目标表在任何时刻都不能有重复记录的情况。比如,某金融客户用Greenplum做实时监查,交易数据通过kafka做流转,源端有可能发送重复的记录,必须借助下游数据库实现数据的去重。另外,由于目前AO表不支持主键索引,无法通过上述函数实现,可以通过将其改写成delete+insert的方式实现。
02事后批量去重
当数据全部入库后,可通过对数据分组找出重复记录,然后删除原有表的重复记录。
注意:这种方式对于heap表和AO表同样有效,通过gp_segment_id和ctid字段的组合可以实现分布式环境下数据的精确定位,最后删除多余的记录。
文章转自公众号:Greenplum中文社区
