Teradata Parallel Transporter（TPT）を使用した巨大なデータのバルクロード

著者 [Adam Tworkiewicz](adam.tworkiewicz@teradata.com)
最終更新日 2022年4月6日

:::note warn
警告
本記事はTeradata Corporationのサイト[Getting Started](https://quickstarts.teradata.com/index.html#getting-access-to-vantage)に掲載された内容を抄訳したものです。掲載内容の正確性・完全性・信頼性・最新性を保証するものではございません。正確な内容については、原本をご参照下さい。
また、修正が必要な箇所やご要望についてはコメントをよろしくお願いします。
:::

# 概要
Vantageに大量のデータを移動させるニーズはよくあります。テラデータはこのようなニーズにこたえるため**Teradata Parallel Transporter (TPT)**ユーティリティを提供しています。このハウツーでは、**TPT**の使用方法を説明します。このシナリオでは30万件以上のレコードをもつ40MB以上のデータを数秒でロードします。

# 前提条件
・Teradata Vantageインスタンスにアクセスできること。

::: note info
メモ！
Vantageの新しいインスタンスが必要な場合は、[Google Cloud](https://qiita.com/ykswi/items/10a382de5fa5a4a42c50)、[Azure](https://qiita.com/ykswi/items/2c30aa1f5413b16c838c)、[AWS](https://qiita.com/ykswi/items/fba559149ad568678d58)のクラウドにVantage Expressという無料版をデプロイメントすることができます。また、[VMware](https://qiita.com/ykswi/items/ebe1d854c38db9bb0f51)、[VirtualBox](https://qiita.com/ykswi/items/ffadaa375add309f2075)、または[UTM](https://qiita.com/ykswi/items/94995954ae723185c2f7)を使用して、ローカルマシン上でVantage Expressを実行することもできます。
:::

・Teradata Tools and Utilities (TTU) のダウンロード
　対応プラットフォームは以下の各OSです。[Windows](https://downloads.teradata.com/download/tools/teradata-tools-and-utilities-windows-installation-package)、[MacOS](https://downloads.teradata.com/download/tools/teradata-tools-and-utilities-mac-osx-installation-package)、[Linux](https://downloads.teradata.com/download/tools/teradata-tools-and-utilities-linux-installation-package-0)


# TTUのインストール

Windowsの場合
ダウンロードしたファイルを解凍し**setup.exe**を実行します。

MacOS
ダウンロードしたファイルを解凍し**TeradataToolsAndUtilitiesXX.XX.XX.pkg**を実行します。

Linux
ダウンロードしたファイルを解凍しそのディレクトリに移動した後、**./setup.sh a**を実行します。

# サンプルデータの入手
非営利団体の米国税務申告を扱います。非営利団体の税務申告は公開データされたでアメリカの政府機関によりがS3バケットで公開されています。2020年の申告のサマリーを取得してみましょう。[https://s3.amazonaws.com/irs-form-990/index_2020.csv](https://s3.amazonaws.com/irs-form-990/index_2020.csv)。ブラウザや**wget**、**curl**を使ってローカルに保存することができます。

# データベースを作成する
Vantageでデータベースを作成してみましょう。以下のクエリーを実行します。

```sql:CreateDatabase.sql
CREATE DATABASE irs
AS PERMANENT = 120e6, -- 120MB
    SPOOL = 120e6; -- 120MB
```

# TPTを実行する
これからTPTを実行します。TPTはVantageへデータをロード、抽出、更新するために使用できるコマンドラインツールです。これらの様々な機能はそれぞれオペレータとして実装されています。
例えばVantageへのデータのロードはLoadオペレータで処理されます。Loadオペレータは大量のデータをVantageにアップロードする際に非常に効率的です。ただしLoadオペレータには高速に処理するためにいくつかの制約があります。
Loadオペレータは空のテーブルにしかデータを挿入できません。すでにデータが存在するテーブルへの挿入はサポートされていません。またセカンダリインデックスを持つテーブルへのデータロードもサポートされていません。さらにテーブルがMULTISETテーブルであっても重複したレコードを挿入することはできません。

制限事項の完全なリストについては、[Teradata® TPT Reference - Load Operator - Restrictions and Limitations](https://docs.teradata.com/r/Teradata-Parallel-Transporter-Reference/February-2022/Load-Operator/Usage-Notes/Normalized-Tables/Restrictions-and-Limitations)を確認してください。

TPTには独自のスクリプト言語があります。この言語では任意のSQLコマンドでデータベースを準備し入力ソースを宣言してVantage にデータを挿入する方法を定義することができます。

csvデータをVantageにロードするためにジョブを定義して実行します。このジョブではデータベースを準備します。古いログテーブルとエラーテーブルを削除しターゲットテーブルを作成した後ファイルを読み込んでデータベースにデータを挿入します。


①	Vantageデータベースへの接続方法をTPTに伝えるジョブ変数ファイル**jobvars.txt**を作成し以下の内容を挿入します。
**host**をデータベースのホスト名に置き換えてください。たとえばローカルのVantage Expressインスタンスを使用する場合は**127.0.0.1**を使用します。**username**にはデータベースのユーザー名を**password**にはデータベースのパスワードを指定します。準備ステップ (DDL) とロード・ステップにはそれぞれ独自の構成値があり、DDLとロード・ステップの両方を構成するには構成値を2回入力する必要があることに注意してください。

```:jobvars.txt
TargetTdpId           = 'host'
TargetUserName        = 'username'
TargetUserPassword    = 'password'

FileReaderDirectoryPath = ''
FileReaderFileName      = 'index_2020.csv'
FileReaderFormat        = 'Delimited'
FileReaderOpenMode      = 'Read'
FileReaderTextDelimiter = ','
FileReaderSkipRows      = 1

DDLErrorList = '3807'

LoadLogTable    = 'irs.irs_returns_lg'
LoadErrorTable1 = 'irs.irs_returns_et'
LoadErrorTable2 = 'irs.irs_returns_uv'
LoadTargetTable = 'irs.irs_returns'
```

②	次に以下の内容のファイルを作成し**load.txt**という名前で保存してください。ジョブファイル内のコメントを参照してその構造を理解してください。

```:load.txt
DEFINE JOB file_load
DESCRIPTION 'Load a Teradata table from a file'
(
  /*
    CSVファイル内のデータのスキーマの定義
  */
  DEFINE SCHEMA SCHEMA_IRS
    (
      in_return_id     VARCHAR(19),
      in_filing_type   VARCHAR(5),
      in_ein           VARCHAR(19),
      in_tax_period    VARCHAR(19),
      in_sub_date      VARCHAR(22),
      in_taxpayer_name VARCHAR(100),
      in_return_type   VARCHAR(5),
      in_dln           VARCHAR(19),
      in_object_id     VARCHAR(19)
    );

  /*
     最初のステップとしてテーブルの作り直しを実行します。
     このステップはのちにod_IRS処理で利用します。
  */
  STEP st_Setup_Tables
  (
    APPLY
      ('DROP TABLE ' || @LoadLogTable || ';'),
      ('DROP TABLE ' || @LoadErrorTable1 || ';'),
      ('DROP TABLE ' || @LoadErrorTable2 || ';'),
      ('DROP TABLE ' || @LoadTargetTable || ';'),
      ('CREATE TABLE ' || @LoadTargetTable || ' (
          return_id INT,
          filing_type VARCHAR(5) CHARACTER SET LATIN NOT CASESPECIFIC,
          ein INT,
          tax_period INT,
          sub_date VARCHAR(100) CHARACTER SET LATIN NOT CASESPECIFIC,
          taxpayer_name VARCHAR(100) CHARACTER SET LATIN NOT CASESPECIFIC,
          return_type VARCHAR(5) CHARACTER SET LATIN NOT CASESPECIFIC,
          dln BIGINT,
          object_id BIGINT
        )
        PRIMARY INDEX ( return_id );')
    TO OPERATOR ($DDL);
  );

  /*
    ファイルを読み込みLoadオペレータに渡しVantageに挿入します。
  */
  STEP st_Load_File
  (
    APPLY
      ('INSERT INTO ' || @LoadTargetTable || ' (
          return_id,
          filing_type,
          ein,
          tax_period,
          sub_date,
          taxpayer_name,
          return_type,
          dln,
          object_id
      ) VALUES (
          :in_return_id,
          :in_filing_type,
          :in_ein,
          :in_tax_period,
          :in_sub_date,
          :in_taxpayer_name,
          :in_return_type,
          :in_dln,
          :in_object_id
      );')
    TO OPERATOR ($LOAD)
    SELECT * FROM OPERATOR($FILE_READER(SCHEMA_IRS));
  );
);
```

③	ジョブを実行します。

```:RunTPT
tbuild -f load.txt -v jobvars.txt -j file_load
```
実行に成功すると、次のようなログが返されます。

```:LogsFromTPT
Teradata Parallel Transporter Version 17.10.00.10 64-Bit
The global configuration file '/opt/teradata/client/17.10/tbuild/twbcfg.ini' is used.
   Log Directory: /opt/teradata/client/17.10/tbuild/logs
   Checkpoint Directory: /opt/teradata/client/17.10/tbuild/checkpoint

Job log: /opt/teradata/client/17.10/tbuild/logs/file_load-4.out
Job id is file_load-4, running on osboxes
Teradata Parallel Transporter SQL DDL Operator Version 17.10.00.10
od_IRS: private log not specified
od_IRS: connecting sessions
od_IRS: sending SQL requests
od_IRS: TPT10508: RDBMS error 3807: Object 'irs_returns_lg' does not exist.
od_IRS: TPT18046: Error is ignored as requested in ErrorList
od_IRS: TPT10508: RDBMS error 3807: Object 'irs_returns_et' does not exist.
od_IRS: TPT18046: Error is ignored as requested in ErrorList
od_IRS: TPT10508: RDBMS error 3807: Object 'irs_returns_uv' does not exist.
od_IRS: TPT18046: Error is ignored as requested in ErrorList
od_IRS: disconnecting sessions
od_IRS: Total processor time used = '0.013471 Second(s)'
od_IRS: Start : Thu Apr  7 20:56:32 2022
od_IRS: End   : Thu Apr  7 20:56:32 2022
Job step st_Setup_Tables completed successfully
Teradata Parallel Transporter Load Operator Version 17.10.00.10
ol_IRS: private log not specified
Teradata Parallel Transporter DataConnector Operator Version 17.10.00.10
op_IRS[1]: Instance 1 directing private log report to 'dtacop-root-368731-1'.
op_IRS[1]: DataConnector Producer operator Instances: 1
op_IRS[1]: ECI operator ID: 'op_IRS-368731'
op_IRS[1]: Operator instance 1 processing file 'index_2020.csv'.
ol_IRS: connecting sessions
ol_IRS: preparing target table
ol_IRS: entering Acquisition Phase
ol_IRS: entering Application Phase
ol_IRS: Statistics for Target Table:  'irs.irs_returns'
ol_IRS: Total Rows Sent To RDBMS:      333722
ol_IRS: Total Rows Applied:            333722
ol_IRS: Total Rows in Error Table 1:   0
ol_IRS: Total Rows in Error Table 2:   0
ol_IRS: Total Duplicate Rows:          0
op_IRS[1]: Total files processed: 1.
ol_IRS: disconnecting sessions
Job step st_Load_File completed successfully
Job file_load completed successfully
ol_IRS: Performance metrics:
ol_IRS:     MB/sec in Acquisition phase: 9.225
ol_IRS:     Elapsed time from start to Acquisition phase:   2 second(s)
ol_IRS:     Elapsed time in Acquisition phase:   5 second(s)
ol_IRS:     Elapsed time in Application phase:   3 second(s)
ol_IRS:     Elapsed time from Application phase to end: < 1 second
ol_IRS: Total processor time used = '0.254337 Second(s)'
ol_IRS: Start : Thu Apr  7 20:56:32 2022
ol_IRS: End   : Thu Apr  7 20:56:42 2022
Job start: Thu Apr  7 20:56:32 2022
Job end:   Thu Apr  7 20:56:42 2022
```

# TPTとNOSの比較
今回の場合ファイルはS3バケットにあります。つまりNative Object Storage (NOS) を使ってデータを取り込むことができます。

```sql:InsertByNOS.sql
-- create an S3-backed foreign table
CREATE FOREIGN TABLE irs_returns_nos
    USING ( LOCATION('/s3/s3.amazonaws.com/irs-form-990/index_2020.csv') );

-- load the data into a native table
CREATE MULTISET TABLE irs_returns_nos_native
    (RETURN_ID, FILING_TYPE, EIN, TAX_PERIOD, SUB_DATE, TAXPAYER_NAME)
AS (
    SELECT RETURN_ID, FILING_TYPE, EIN, TAX_PERIOD, SUB_DATE, TAXPAYER_NAME FROM irs_returns_nos
) WITH DATA
NO PRIMARY INDEX;
```

NOSソリューションは追加ツールに依存せずSQLだけで実装できるので便利です。NOSタスクがAMPに委ねられ並行して実行されるため特にAMPの数が多いVantageでの実行では高いパフォーマンスを発揮します。またオブジェクトストレージのデータを複数のファイルに分割することでさらにパフォーマンスが向上する可能性もあります。

# まとめ
このハウツーでは、Vantage に大量のデータをインジェストする方法を紹介しました。**TPT** を使用して、数十万件のレコードを数秒で Vantage に取り込みました。

# さらに詳しく

・[Teradata® TPT User Guide](https://docs.teradata.com/r/Teradata-Parallel-Transporter-User-Guide/February-2022)
・[Teradata® TPT Reference](https://docs.teradata.com/r/Teradata-Parallel-Transporter-Reference/February-2022)
・[Query data stored in object storage](https://quickstarts.teradata.com/nos.html)

#### Teradata Vantageへのお問合せ
[Teradata Vantage へのお問合せ](https://www.teradata.jp/About-Us/Contact)