17.00 - 17.05 - Rテーブル演算子の例:エコーの例 - Advanced SQL Engine - Teradata Database

Teradata Vantage™ - SQL外部ルーチン プログラミング

Product
Advanced SQL Engine
Teradata Database
Release Number
17.00
17.05
Published
2020年6月
Content Type
プログラミング リファレンス
Publication ID
B035-1147-170K-JPN
Language
日本語 (日本)

この例は、入力から読み取ったテーブルをエコーするRプログラムを示しています。

前提条件

この例を実行するには、次が必要です。

  • R 3.2.1以降のインストール。
  • DipRTblOpが実行されたことがない場合は実行。

エコーの例

create table test(i int, j int);

insert into test values(10,1);
insert into test values(20,2);
insert into test values(30,3);
insert into test values(40,4);
insert into test values(50,5);

sel * from test;

sel * from td_sysgpl.execr (
  ON (sel * from test)
  using
  keepLog(1)
  contract
  (
    'library(tdr);
     on_clause_input_stream <- 0;
     on_clause_output_stream <- 0;
     direction <- "R";

     incols <- tdr.GetColDef(on_clause_input_stream, direction);
     tdr.SetOutputColDef(on_clause_output_stream, incols);'
  )
  operator
  (
    'library(tdr);

     streamin <- 0;
     streamout <- 0;
     read_direction <- "R";
     write_direction <- "W";

     options <- 0;
     inHandle <- tdr.Open(read_direction, streamin, options);
     outHandle <- tdr.Open(write_direction, streamout, options);

     numcols <- tdr.GetColCount(streamin, read_direction);

     while (tdr.Read(inHandle) == 0)
     {
       lapply( 0: (numcols - 1),
               function(index){
                 att <- tdr.GetAttributeByNdx(inHandle, index, NULL);
                 tdr.SetAttributeByNdx(outHandle, index, att, NULL);
               });

       tdr.Write(outHandle);
     };

     tdr.Close(inHandle);
     tdr.Close(outHandle);'
  )
) as Rexp;

結果:

          i            j
-----------  -----------
         20            2
         10            1
         40            4
         30            3
         50            5

エコー例の説明

このクエリーでは、ON句はシンプルに保たれます。Hash By、Partition By、Order Byは指定されていません。したがって、どの行も再配置されず、オペレータ コードへの入力のためのAMPのように読み込まれます。最初の列値は固有であるため、各AMP(4つのAMPシステム上)が少なくとも1つの行を取得するように、i(またはj)によってハッシュを指定できます。

keepLogキーは、/home/tdatuserのファイルにstdoutを書き込むために1の値で指定されます。N AMPシステムでは、コントラクト用のログ ファイルと、オペレータ用のNログ ファイル(各AMP用)が1つあります。

コントラクトとオペレータの両方で、tdr.GetColDefとtdr.Openを使用する場合は、それぞれstreaminを使用して、ON句から位置による入力を参照します。最大16個のON句を使用できるため、0~15の整数を指定できます。コントラクトでは、変数はon_clause_input_streamと呼ばれます。

コントラクトは、1つのスレッドによって実行され、オペレータ コードを処理するときに、AMPによって使用される情報を格納できます。コントラクトの主な目的は、出力列の定義を設定することです。この場合、出力列の定義は単に入力と同じです。

テスト テーブルの各行が異なるAMP上にあり、オペレータ コードが各AMPで並列に実行されるため、各AMPの入力は通常異なります。この結果はWHILEループで見ることができます。WHILEループは、入力ストリームの末尾に到達するまで、入力ハンドルのtdr.Readを呼び続けます。

tdr.Read関数は、入力ストリームから1行ずつ読み取ります。処理する入力行がないAMPは、入力および出力の両方のハンドルを閉じます。出力ストリームには何も書き込まれません。入力があるAMPの場合、tdr.read関数は、入力ハンドルにデータを読み込み、出力を書き込むために使用することができます。

この後者のケースは、例のWHILEループ内で見られます。行が入力ハンドルに読み取られると、各列の値はtdr.GetAttributeByNdxを使って入力ハンドルから読み取られ、その後、列の型がコントラクトで定義されたtdr.SetAttributeByNdxを使って出力ハンドルの対応する列に書き込まれます。