この例は、入力から読み取ったテーブルをエコーする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を使って出力ハンドルの対応する列に書き込まれます。