AnalyticDB for PostgreSQL は Teradata 構文と互換性があります。このガイドでは、Teradata から AnalyticDB for PostgreSQL への移行を計画するために必要な構文の相違点、データ型マッピング、および同等機能について説明します。
移行要件
Teradata から AnalyticDB for PostgreSQL への移行を成功させるには、以下の目標を達成するように設計されています。
データウェアハウスの基盤となるデータプラットフォームの完全な移行を実行します。
データウェアハウスシステムにデプロイされたアプリケーションのスムーズな移行を実行します。
ビジネスユーザーが認識しないビジネスプラットフォームとデータの移行を実行します。
移行後のデータウェアハウスの良好なパフォーマンスを確保します。
適切な移行期間と移行計画を設定します。
元のシステムアーキテクチャー、ETL プロセス、データ構造、および管理ツールを完全に再利用します。
移行範囲
Teradata の完全な移行には、以下の 4 つの領域が含まれます。
既存データ: 指定されたデリミタと文字コードを使用してデータをテキストファイルとしてエクスポートし、Elastic Compute Service (ECS) インスタンスのローカルディスクまたは AnalyticDB for PostgreSQL インスタンスと同じネットワーク上の Object Storage Service (OSS) バケットに保存します。その後、gpfdist プロトコルを介して OSS 外部テーブルからファイルをロードします。Teradata から DDL スクリプトをエクスポートし、AnalyticDB for PostgreSQL 構文を使用してバッチ変換します。
Extract-Transform-Load (ETL) プロセス: スクリプトベースの変換ツールを使用して、ETL ステートメントを AnalyticDB for PostgreSQL の Data Manipulation Language (DML) 構文に変換します。このドキュメントの関数マッピングテーブルに基づいて、Teradata 関数を AnalyticDB for PostgreSQL の同等機能に置き換えます。既存データ移行の完了後、ETL ジョブを再構成して再起動します。
API 接続: AnalyticDB for PostgreSQL は JDBC および ODBC プロトコルをサポートしているため、ビジネスインテリジェンス (BI) フロントエンドツールも同様に接続します。API 移行を完了するには、インスタンスの IP アドレスを更新します。
管理ツール: AnalyticDB for PostgreSQL インスタンス用のバックアップと復元ツールをデプロイし、定期的なリカバリ訓練をスケジュールします。
データ型マッピング
ほとんどのコアデータ型は、Teradata と AnalyticDB for PostgreSQL 間で直接マッピングされます。スクリプトベースの Data Definition Language (DDL) 変換ツールは、バッチ変換を自動的に処理します。
| Teradata | AnalyticDB for PostgreSQL | Notes |
|---|---|---|
| CHAR | CHAR | 直接マッピング |
| VARCHAR | VARCHAR | 直接マッピング |
| LONG VARCHAR | VARCHAR(64000) | 固定最大長 |
| VARBYTE(size) | BYTEA | バイナリデータ型 |
| BYTEINT | BYTEA | バイナリデータ型 |
| SMALLINT | SMALLINT | 直接マッピング |
| INTEGER | INTEGER | 直接マッピング |
| DECIMAL(size,dec) | DECIMAL(size,dec) | 直接マッピング |
| NUMERIC(precision,dec) | NUMERIC(precision,dec) | 直接マッピング |
| FLOAT | FLOAT | 直接マッピング |
| REAL | REAL | 直接マッピング |
| DOUBLE PRECISION | DOUBLE PRECISION | 直接マッピング |
| DATE | DATE | 直接マッピング |
| TIME | TIME | 直接マッピング |
| TIMESTAMP | TIMESTAMP | 直接マッピング |
テーブル作成ステートメント
以下の例では、Teradata DDL 文が AnalyticDB for PostgreSQL にどのように対応するかを示します。主な違いは、変換後の文に注釈が付けられています。
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:
-- MULTISET TABLE, NO FALLBACK, NO BEFORE JOURNAL, NO AFTER JOURNAL,
-- CHECKSUM, DEFAULT MERGEBLOCKRATIO: Teradata 固有の句は削除されました
-- FORMAT 'YYYYMMDD', TITLE, CHARACTER SET, CASESPECIFIC: 列属性は削除されました
CREATE TABLE test_table
(
first_column DATE NOT NULL, -- FORMAT 'YYYYMMDD' は削除されました。エンコーディングには SET client_encoding を使用します
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 ) -- PRIMARY INDEX -> DISTRIBUTED BY
PARTITION BY RANGE(first_column) -- RANGE_N 構文は標準の RANGE に変換されました
(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); -- インデックス構文は変更されていませんDDL 差分のまとめ
| Area | Teradata | AnalyticDB for PostgreSQL |
|---|---|---|
| 分散キー | PRIMARY INDEX (col1, col2) | DISTRIBUTED BY (col1, col2) |
| パーティショニング | PARTITION BY RANGE_N(...) | PARTITION BY RANGE(...) with START/END/EVERY |
| インデックス作成 | CREATE INDEX idx (cols) ON table | CREATE INDEX idx ON table(cols) |
| 列タイトル | TITLE 'label' | COMMENT ON COLUMN table.col IS 'label'; |
| 列エンコーディング | CHARACTER SET LATIN CASESPECIFIC | SET client_encoding = latin1; (セッションレベル) |
| テーブル属性 | MULTISET, NO FALLBACK, CHECKSUM, etc. | サポートされていません。これらの句を削除します |
データインポートおよびエクスポート形式
Teradata と AnalyticDB for PostgreSQL は両方とも TXT および CSV ファイル形式をサポートしています。主な相違点は区切り文字です。
Teradata: 2 文字の区切り文字
AnalyticDB for PostgreSQL: 1 文字の区切り文字
ロードする前に、データファイル内の区切り文字を変換してください。
SQL ステートメントの相違点
AnalyticDB for PostgreSQL は、ほとんどの Teradata SQL 構文をサポートしています。以下のステートメントは変換が必要です。
CAST
Teradata の CAST 文は書式指定子をサポートしていますが、AnalyticDB for PostgreSQL はサポートしていません。
| Statement | Teradata | AnalyticDB for PostgreSQL |
|---|---|---|
| Integer cast | CAST(x AS INT FORMAT '999999') | 置き換えにはカスタム関数を作成します |
| Date cast | CAST(x AS DATE FORMAT 'YYYYMMDD') | CAST(x AS DATE)YYYY-MM-DD — 変更は不要です。YYYY-MM-DD はネイティブにサポートされています |
QUALIFY
Teradata の QUALIFY キーワードは、ウィンドウ関数の結果をインラインでフィルターします。AnalyticDB for PostgreSQL は QUALIFY をサポートしていないため、サブクエリとして書き換える必要があります。
Teradata:
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:
-- ウィンドウ関数をサブクエリでラップし、外側の WHERE 句でフィルタリングします
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;MACRO
Teradata マクロは、名前付きの単位として一連の SQL ステートメントを実行します。AnalyticDB for PostgreSQL はマクロをサポートしていません。代わりに、FUNCTION を使用してください。
Teradata:
CREATE MACRO Get_Emp_Salary(EmployeeNo INTEGER) AS (
SELECT
EmployeeNo,
NetPay
FROM
Salary
WHERE EmployeeNo = :EmployeeNo;
);AnalyticDB for PostgreSQL:
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 の同等機能とのマッピングを示しています。直接的な同等機能がない関数については、使用する SQL 式が表に示されています。
| Teradata | AnalyticDB for PostgreSQL | Description |
|---|---|---|
ZEROIFNULL(x) | COALESCE(x, 0) | 累積計算のために NULL を 0 に変換します |
NULLIFZERO(x) | COALESCE | 累積データのために 0 の値を NULL に置き換えます |
INDEX(str, substr) | POSITION(substr IN str) | 文字列内の部分文字列の位置を返します |
ADD_MONTHS(date, n) | TO_DATE | 入力日付に指定された月数を加算または減算します |
FORMAT | TO_CHAR / TO_DATE | データを文字列または日付としてフォーマットします |
CSUM(col, order_col) | サブクエリ | パーティション内の各行の値式の累積合計を返します |
MAVG(col, n, order_col) | サブクエリ | 定義された行数 (クエリ幅) に基づいて、指定された列の移動平均を計算します |
MSUM(col, n, order_col) | サブクエリ | 定義されたクエリ幅に基づいて、指定された列の移動合計を計算します |
MDIFF(col, n, order_col) | サブクエリ | 定義されたクエリ幅に基づいて、指定された列の移動差分を計算します |
QUALIFY | ウィンドウ関数結果に対する WHERE を含むサブクエリ | 資格確認ウィンドウ関数の結果をフィルタリングします。上記の「QUALIFY」セクションをご参照ください。 |
CHAR(str) / CHARACTERS(str) | LENGTH(str) | 文字列内の文字数を返します |