すべてのプロダクト
Search
ドキュメントセンター

AnalyticDB:TeradataデータベースからAnalyticDB for PostgreSQLインスタンスへのデータの移行

最終更新日:Sep 24, 2024

このトピックでは、TeradataデータベースからAnalyticDB for PostgreSQLインスタンスにデータを移行する方法について説明します。

移行要件

AnalyticDB for PostgreSQLは、Teradata構文と互換性があります。 TeradataデータベースからAnalyticDB for PostgreSQLインスタンスにデータを移行するには、元のシステムアーキテクチャ、Extract-Transform-Load (ETL) プロセス、データ構造、および管理ツールの再利用に基づいてDDLスクリプトを変換する必要があります。 また、データの整合性と正確性を確保しながら、履歴データを移行する必要があります。

  • データウェアハウスの基になるデータプラットフォームの完全な移行を実行します。

  • データウェアハウスシステムにデプロイされたアプリケーションのスムーズな移行を実行します。

  • ビジネスプラットフォームとデータを認識していないビジネスユーザーの移行を実行して、2つのシステム間で操作の一貫性を保ちます。

  • 移行後のデータウェアハウスの良好なパフォーマンスを確保します。

  • 有利な移行期間と移行計画を設定します。

  • 元のシステムアーキテクチャ、Extract-Transform-Load (ETL) プロセス、データ構造、および管理ツールを完全に再利用します。

  1. 履歴データを移行するには、まず指定された区切り文字と文字エンコード方法を使用して、データをテキストファイルにエクスポートする必要があります。 次に、エクスポートしたファイルをECSインスタンスまたはOSSバケットのローカルディスクに保存します。 ローカルディスクとOSSバケットは、AnalyticDB for PostgreSQLインスタンスと同じネットワークに属している必要があります。 上記の操作により、AnalyticDB for PostgreSQLインスタンスは、gpfdistプロトコルを使用してOSS外部テーブルからファイルを読み取ることができます。 最後に、TeradataデータベースからDDLスクリプトをエクスポートし、AnalyticDB for PostgreSQL構文を使用してスクリプトを一括変更して、AnalyticDB for PostgreSQLインスタンスにすべてのユーザーテーブルを作成できるようにします。

  2. ルーチンETLプロセスを移行するには、まずAnalyticDB for PostgreSQLのデータ操作言語 (DML) 構文に基づいてETLステートメントを変換する必要があります。 AnalyticDB for PostgreSQLは、構文マッピングを自動的に実行できるスクリプトベースのツールを提供します。 次に、Teradata関数とAnalyticDB for PostgreSQL関数の間のマッピングに基づいて関連する関数を置き換えて、ETL操作によるデータベースへのアクセス方法を変換します。 履歴データの移行が成功した後、ETL操作を再構成し、ルーチンのETL操作を開始します。

  3. AnalyticDB for PostgreSQLインスタンスは、JDBCおよびODBCプロトコルをサポートしています。 ビジネスインテリジェンス (BI) フロントエンドツールは、JDBCおよびODBCプロトコルを介してデータウェアハウスにアクセスできます。 APIを移行するには、インスタンスのIPアドレスを変更するだけです。

  4. 管理ツールを移行するには、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

文字数を指定します。