さらに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() );