このトピックでは、TeradataデータベースからAnalyticDB for PostgreSQLインスタンスにデータを移行する方法について説明します。
移行要件
AnalyticDB for PostgreSQLは、Teradata構文と互換性があります。 TeradataデータベースからAnalyticDB for PostgreSQLインスタンスにデータを移行するには、元のシステムアーキテクチャ、Extract-Transform-Load (ETL) プロセス、データ構造、および管理ツールの再利用に基づいてDDLスクリプトを変換する必要があります。 また、データの整合性と正確性を確保しながら、履歴データを移行する必要があります。
データウェアハウスの基になるデータプラットフォームの完全な移行を実行します。
データウェアハウスシステムにデプロイされたアプリケーションのスムーズな移行を実行します。
ビジネスプラットフォームとデータを認識していないビジネスユーザーの移行を実行して、2つのシステム間で操作の一貫性を保ちます。
移行後のデータウェアハウスの良好なパフォーマンスを確保します。
有利な移行期間と移行計画を設定します。
元のシステムアーキテクチャ、Extract-Transform-Load (ETL) プロセス、データ構造、および管理ツールを完全に再利用します。
履歴データを移行するには、まず指定された区切り文字と文字エンコード方法を使用して、データをテキストファイルにエクスポートする必要があります。 次に、エクスポートしたファイルをECSインスタンスまたはOSSバケットのローカルディスクに保存します。 ローカルディスクとOSSバケットは、AnalyticDB for PostgreSQLインスタンスと同じネットワークに属している必要があります。 上記の操作により、AnalyticDB for PostgreSQLインスタンスは、gpfdistプロトコルを使用してOSS外部テーブルからファイルを読み取ることができます。 最後に、TeradataデータベースからDDLスクリプトをエクスポートし、AnalyticDB for PostgreSQL構文を使用してスクリプトを一括変更して、AnalyticDB for PostgreSQLインスタンスにすべてのユーザーテーブルを作成できるようにします。
ルーチンETLプロセスを移行するには、まずAnalyticDB for PostgreSQLのデータ操作言語 (DML) 構文に基づいてETLステートメントを変換する必要があります。 AnalyticDB for PostgreSQLは、構文マッピングを自動的に実行できるスクリプトベースのツールを提供します。 次に、Teradata関数とAnalyticDB for PostgreSQL関数の間のマッピングに基づいて関連する関数を置き換えて、ETL操作によるデータベースへのアクセス方法を変換します。 履歴データの移行が成功した後、ETL操作を再構成し、ルーチンのETL操作を開始します。
AnalyticDB for PostgreSQLインスタンスは、JDBCおよびODBCプロトコルをサポートしています。 ビジネスインテリジェンス (BI) フロントエンドツールは、JDBCおよびODBCプロトコルを介してデータウェアハウスにアクセスできます。 APIを移行するには、インスタンスのIPアドレスを変更するだけです。
管理ツールを移行するには、AnalyticDB for PostgreSQLインスタンスのバックアップおよび復元ツールをデプロイして、データをバックアップし、定期的に復旧ドリルを実行する必要があります。
AnalyticDB for PostgreSQLとTeradataのコアデータ型は、相互に互換性があります。 一部のデータ型のみを変更する必要があります。 テーブル作成用のDDLステートメントは、AnalyticDB for PostgreSQLのスクリプトベースのツールを使用してバッチで自動的に変換されます。 AnalyticDB for PostgreSQLおよびTeradataのデータ型を次の表に示します。
Teradata | ADB PG |
CHAR | CHAR |
VARCHAR | VARCHAR |
ロングVARCHAR | VARCHAR(64000) |
VARBYTE (size) | BYTEA |
BYTEINT | BYTEA |
SMALLINT | SMALLINT |
INTEGER | INTEGER |
DECIMAL (size、dec) | DECIMAL (サイズ、dec) |
NUMBERIC (precision、dec) | 数値 (精度、dec) |
FLOAT | FLOAT |
REAL | REAL |
DOUBLE PRECISION | DOUBLE PRECISION |
DATE | 日付 |
TIME | 時間 |
TIMESTAMP | TIMESTAMP |
テーブル作成ステートメント
このセクションでは、例を使用して、AnalyticDB for PostgreSQLとTeradataの違いについて説明します。
Teradataでテーブルを作成するには、次のステートメントを実行します。
CREATE MULTISET TABLE test_table,NO FALLBACK ,
NO BEFORE JOURNAL,
NO AFTER JOURNAL,
CHECKSUM = DEFAULT,
DEFAULT MERGEBLOCKRATIO
(
first_column DATE FORMAT 'YYYYMMDD' TITLE 'COLUMN 1' NOT NULL,
second_column INTEGER TITLE 'COLUMN 2' NOT NULL ,
third_column CHAR(6) CHARACTER SET LATIN CASESPECIFIC TITLE 'COLUMN 3' NOT NULL ,
fourth_column CHAR(20) CHARACTER SET LATIN CASESPECIFIC TITLE 'COLUMN 4' NOT NULL,
fifth_column CHAR(1) CHARACTER SET LATIN CASESPECIFIC TITLE 'COLUMN 5' NOT NULL,
sixth_column CHAR(24) CHARACTER SET LATIN CASESPECIFIC TITLE 'COLUMN 6' NOT NULL,
seventh_column VARCHAR(18) CHARACTER SET LATIN CASESPECIFIC TITLE 'COLUMN 7' NOT NULL,
eighth_column DECIMAL(18,0) TITLE 'COLUMN 8' NOT NULL ,
nineth_column DECIMAL(18,6) TITLE 'COLUMN 9' 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;
AnalyticDB for PostgreSQLでテーブルを作成するには、次のステートメントを実行します。
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);
上記の例に基づいて、AnalyticDB for PostgreSQLとTeradataのテーブル作成ステートメントの類似点と相違点は次のとおりです。
コアデータ型は互いに互換性があり、変更は必要ありません。
AnalyticDB for PostgreSQLとTeradataはどちらも配布列をサポートしていますが、構文は異なります。 PRIMARY INDEX句はTeradataで使用され、DISTRIBUTED BYはAnalyticDB for PostgreSQLで使用されます。
AnalyticDB for PostgreSQLとTeradataはどちらもPARTITION BY句をサポートしています。 AnalyticDB for PostgreSQLとTeradataのこのような句は、セマンティクスは同じですが、構文が異なります。
AnalyticDB for PostgreSQLとTeradataの両方でテーブルにインデックスを作成できますが、使用される構文は異なります。
AnalyticDB for PostgreSQLはTITLEキーワードをサポートしていませんが、次のステートメントを実行して特定の列にコメントを追加できます。
comment ON column table_name.column_name IS 'XXX';
AnalyticDB for PostgreSQLは、CHARまたはVARCHARデータ型を定義する場合、エンコード型を宣言できません。
SET client_encoding = latin1;
ステートメントを使用して、エンコードタイプを宣言できます。
インポートおよびエクスポートされたデータ形式
AnalyticDB for PostgreSQLとTeradataの両方で、TXTまたはCSV形式でデータをインポートまたはエクスポートできます。 違いは、データファイルで使用されるセパレータにあります。
Teradataは2文字のセパレータを使用します。
AnalyticDB for PostgreSQLは、1文字の区切り文字を使用します。
SQL 文
AnalyticDB for PostgreSQLは、TeradataのほとんどのSQL文の構文と互換性があります。 次の構文を変更するだけです。
キャスト
Teradataで:
cast(XXX as int format '999999') cast(XXX as date format 'YYYYMMDD')
AnalyticDB for PostgreSQLの場合:
cast(XXX as int) cast(XXX as date)
AnalyticDB for PostgreSQLは、CASTステートメントで形式を宣言しません。
cast(XXX as int format '999999')
ステートメントの場合、置換用の関数を記述する必要があります。AnalyticDB for PostgreSQLは日付の
'YYYY-MM-DD '
形式をサポートしているため、キャスト (XXX as date format 'YYYYMMDD')
ステートメントを変更する必要はありません。
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;
AnalyticDB for PostgreSQLは、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;
マクロ
TeradataはMACROを使用してSQL文のグループを実行します。 例:
CREATE MACRO Get_Emp_Salary(EmployeeNo INTEGER) AS ( SELECT EmployeeNo, NetPay FROM Salary WHERE EmployeeNo = :EmployeeNo; );
AnalyticDB for PostgreSQLはマクロをサポートしていませんが、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;
関数マッピング
Teradata関数とAnalyticDB for PostgreSQL関数間のマッピング
Teradata関数 | AnalyticDB for PostgreSQL関数 | 説明 |
ZEROIFNULL | COALESCE | 累積データのゼロに変換してnull値を処理します。 |
NULLIFZERO | COALESCE | 累積データの0値をNULLに置き換えます。 |
INDEX | POSITION | 文字列内の部分文字列の位置 (整数) を返します。 |
ADD_MONTHS | TO_DATE | 指定した月数を入力日に加算または減算します。 |
FORMAT | TO_CHAR/TO_DATE | データの形式を指定します。 |
CSUM | Subquery | パーティション内の各行の値式の累積合計を返します。 |
MAVG | Subquery | クエリ幅とも呼ばれる定義された行数に基づいて、指定された列の移動平均を計算します。 |
MSUM | Subquery | 定義されたクエリ幅に基づいて、指定された列の移動合計を計算します。 |
MDIFF | Subquery | 定義されたクエリ幅に基づいて、指定された列の移動差分を計算します。 |
QUALIFY | Subquery | ユーザーが指定した条件に基づいて、並べ替え関数の結果をフィルターします。 |
CHAR /CHARACTERS | LENGTH | 文字数を指定します。 |