Teradata應用遷移到AnalyticDB for PostgreSQL指導

AnalyticDB for PostgreSQL(簡稱:ADB for PG)對Teradata語法有着很好的兼容,將Teradata應用遷移到ADB for PG,只需進行有限的修改。本文介紹將Teradata應用遷移到ADB for PG應該注意的事項。sql

1 建表語句

咱們經過一個例子比較ADB for PG和Teradata的建表語句。對於以下的Teradata建表SQL語句,數據庫

CREATE MULTISET TABLE test_table,NO FALLBACK ,
     NO BEFORE JOURNAL,
     NO AFTER JOURNAL,
     CHECKSUM = DEFAULT,
     DEFAULT MERGEBLOCKRATIO
     (
      first_column DATE FORMAT 'YYYYMMDD' TITLE '第一列' NOT NULL,
      second_column INTEGER TITLE '第二列' NOT NULL ,
      third_column CHAR(6) CHARACTER SET LATIN CASESPECIFIC TITLE '第三列' NOT NULL ,
      fourth_column CHAR(20) CHARACTER SET LATIN CASESPECIFIC TITLE '第四列' NOT NULL,
      fifth_column CHAR(1) CHARACTER SET LATIN CASESPECIFIC TITLE '第五列' NOT NULL,
      sixth_column CHAR(24) CHARACTER SET LATIN CASESPECIFIC TITLE '第六列' NOT NULL,
      seventh_column VARCHAR(18) CHARACTER SET LATIN CASESPECIFIC TITLE '第七列' NOT NULL,
      eighth_column DECIMAL(18,0) TITLE '第八列' NOT NULL ,
      nineth_column DECIMAL(18,6) TITLE '第九列' NOT NULL )
PRIMARY INDEX ( first_column ,fourth_column )
PARTITION BY RANGE_N(first_column  BETWEEN DATE '1999-01-01' AND DATE '2050-12-31' EACH INTERVAL '1' DAY );

CREATE INDEX test_index (first_column, fourth_column) ON test_table;

能夠修改爲ADB for PG的建表語句:函數

CREATE TABLE test_table
     (
      first_column DATE NOT NULL,
      second_column INTEGER NOT NULL ,
      third_column CHAR(6) NOT NULL ,
      fourth_column CHAR(20) NOT NULL,
      fifth_column CHAR(1) NOT NULL,
      sixth_column CHAR(24) NOT NULL,
      seventh_column VARCHAR(18) NOT NULL,
      eighth_column DECIMAL(18,0) NOT NULL ,
      nineth_column DECIMAL(18,6) NOT NULL )
DISTRIBUTED BY ( first_column ,fourth_column )
PARTITION BY RANGE(first_column) 
(START (DATE '1999-01-01')  INCLUSIVE
END (DATE '2050-12-31')  INCLUSIVE
EVERY (INTERVAL '1 DAY' ) );

create index test_index on test_table(first_column, fourth_column);

經過以上例子,咱們能夠很清晰地分析ADB for PG和Teradata建表語句的異同:
一、ADB for PG和Teradata的數據類型是互相兼容的,數據類型不須要作修改;
二、ADB for PG和Teradata均支持分佈列,但語法不一樣,Teradata是primary index,ADB for PG是distributed by;
三、ADB for PG和Teradata均支持PARTITION BY二級分區,語義相同但語法不一樣;
四、ADB for PG和Teradata均支持對錶建立索引,但語法不一樣;
五、ADB for PG不支持TITLE關鍵字,可是支持單獨對列添加註釋COMMENT,語法爲COMMENT ON COLUMN table_name.column_name IS 'XXX';
六、ADB for PG不能在定義char或者varchar時聲明編碼類型,而是在鏈接上數據庫時,經過執行「SET client_encoding = latin1;」來申明編碼類型。編碼

2 導入導出數據格式

ADB for PG支持txt、csv格式的數據導入導出,和Teradata的區別就在於數據文件的分隔符:Teradata支持雙分隔符,而ADB for PG只支持單分隔符。spa

3 SQL語句

ADB for PG和Teradata的SQL語法大部分都是兼容的,除了特定的Teradata語法、系統函數是須要進行修改的。code

3.1 特定語法

3.3.1 castorm

Teradata支持相似以下的cast語法:blog

cast(XXX as int format '999999')
cast(XXX as date format 'YYYYMMDD')

而ADB for PG支持相似cast(XXX as int)、cast(XXX as date),不支持在cast中聲明format。因此,對於cast(XXX as int format '999999'),須要編寫函數來實現相同功能;而對於cast(XXX as date format 'YYYYMMDD'),ADB for PG支持date的顯示格式爲'YYYY-MM-DD',這個是不影響正常使用的。排序

3.3.2 qualify索引

Teradata的qualify關鍵字,用來根據用戶的條件,進一步過濾前序排序計算函數獲得的結果。以下是一個Teradata的qualify關鍵字使用例子:

SELECT itemid, sumprice, RANK() OVER (ORDER BY sumprice DESC)
     FROM (SELECT a1.item_id, SUM(a1.sale)
           FROM sales AS a1 
           GROUP BY a1.itemID) AS t1 (itemid, sumprice) 
     QUALIFY RANK() OVER (ORDER BY sum_price DESC) <=100;

而ADB for PG是不支持qualify關鍵字的,因此須要將帶qualify的sql語句,修改成子查詢嵌套:

SELECT itemid, sumprice, rank from 
(SELECT itemid, sumprice, RANK() OVER (ORDER BY sumprice DESC) as rank
     FROM (SELECT a1.item_id, SUM(a1.sale)
           FROM sales AS a1 
           GROUP BY a1.itemID) AS t1 (itemid,sumprice)
)  AS a
where rank <=100;

3.3.3 macro

Teradata經過macro來執行一組SQL語句,一個典型的macro例子爲:

CREATE MACRO Get_Emp_Salary(EmployeeNo INTEGER) AS ( 
   SELECT 
   EmployeeNo, 
   NetPay 
   FROM  
   Salary 
   WHERE EmployeeNo = :EmployeeNo; 
);

ADB for PG不支持macro,可是能夠輕易地用ADB for PG的function來完成Teradata的macro功能:

CREATE OR REPLACE FUNCTION Get_Emp_Salary(
        EmployeeNo INTEGER,
        OUT EmployeeNo INTEGER,
        OUT NetPay FLOAT
) returns setof record AS 
$$

        SELECT EmployeeNo,NetPay 
        FROM Salary
        WHERE EmployeeNo = $1

$$
 LANGUAGE SQL;

3.3.4 系統函數

ADB for PG和Teradata關鍵系統函數對照表:



本文做者:陸封

閱讀原文

本文爲雲棲社區原創內容,未經容許不得轉載。

相關文章
相關標籤/搜索