17.00 - 17.05 - 中間結果の保存 - 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
日本語 (日本)

さらにUDFのPhase.AGR_INIT集約フェーズでは、引数によって渡される最初のデータ値セットを、中間集約記憶域に保存することも必要です。最初のデータ値セットは、そのグループで集約の対象となる最初の行のデータです。

その後、Phase.AGR_DETAIL集約フェーズでメソッドが呼び出されるごとに、関数は引数によって渡される行データを、その特定のグループに対応する中間集約記憶域に累積する必要があります。集約の対象となる各グループごとに、それぞれ別個の中間記憶域があります。

Phase.AGR_DETAIL集約フェーズでは、メソッドは、コンテキスト入力引数でgetObject()やgetBytes()を呼び出すことにより、以前蓄積されたデータへのアクセスが可能になります。標準偏差の例では、次のコードで以前蓄積したデータにアクセスします。

agr_storage s1 = (agr_storage)context[0].getObject(1);

また、メソッドがバイト アレイを使ってデータを格納する場合は、次のコードにより以前保存した値にアクセスします。

ByteBuffer s1 = ByteBuffer.wrap(context[0].getBytes(1));
double count = s1.getDouble();
double x_sq = s1.getDouble();
double x_sum = s1.getDouble();
標準偏差のサンプルのx入力引数は、標準偏差の計算の対象となる列です。標準偏差の計算では、このメソッドはxの値を使用して次を計算します。
  • sum(X2)
  • sum(X)

メソッドがagr_storageオブジェクトを使ってデータを格納する場合は、次のコードが列値を使用して必要な計算を実行し、その結果を中間記憶域に加算します。

s1.count++;
s1.x_sq += x*x;
s1.x_sum += x;
context[0].setObject( 1, s1 );

また、メソッドがデータの格納にバイト アレイを使用する場合は、コードは次のようになります。

s1 = ByteBuffer.allocate(24);
count++;
x_sq += x*x;
x_sum += x;
s1.putDouble(count);
s1.putDouble(x_sq);
s1.putDouble(x_sum);
context[0].setBytes( 1, s1.array() );