CALCMATRIXは、1つの入力行列または複数の入力行列を表わすデータを処理します。後者の場合、特定の入力行がどの行列に属するかを識別する1つ以上の列が、入力に含まれている必要があります。これらの列はmatrix id columnsと呼ばれ、行列ID列の1組の値はmatrix idと呼ばれます。同じ行列のすべての行は、行列IDが同じである必要があります。
CALCMATRIXは、LOCALフェーズおよびCOMBINEフェーズで機能します。
- LOCALフェーズでは、各AMPのソース テーブルに存在する入力データを個別に処理し、そのAMP用に要約したデータ行を出力します。AMP間でデータが移動することはありません。
- COMBINEフェーズでは、各AMPからのサマリー データ(つまりLOCALフェーズからの出力)を処理し、それを組み合わせて最終出力となる行を形成します。
1つの結果の行列(または、複数の行列ID列がある場合には、行列IDごとの1つの結果の行列)を取得するには、COMBINEフェーズで、HASH BY句と、場合によってはLOCAL ORDER BY句を使用する必要があります。
LOCALフェーズの詳細
- LOCALフェーズへの入力は、0個以上の行列ID列、および1つ以上のデータ列(この数をnと呼びます)で構成されている必要があります。行列ID列がある場合は、行列ID列をLOCAL ORDER BYリストに配置する必要があります。
- LOCALフェーズからの出力は、行列ID列(存在する場合)、rownumという名前のINT列、rownameという名前のVARCHAR(128)列、c(カウントの略)という名前のBIGINT列、s(合計の略)という名前のREAL列、および各入力データ列のREAL列で構成されています。
- LOCALフェーズのCALCTYPEとOUTPUTのカスタム値は、常に、それぞれ'SSCP'と'COLUMNS'に設定されます。これらのキーにそれ以外の値を使用しても無視されます。
- 行のいずれかのデータ列にNULLがある場合、その行の処理はNULL_HANDLINGの設定によって異なります。
COMBINEフェーズの詳細
- COMBINEフェーズへの入力は、LOCALフェーズから出力される列と正確に一致する必要があります。ゼロ個以上の行列ID列、INT rownum列、VARCHAR(128) rowname列、c(カウントの略)という名前のBIGINT列、s(合計の略)という名前のREAL列、および各入力データ列のREAL列です。
データ内に行列ID列がある場合は、その列をHASH BYリストおよびLOCAL ORDER BYリストに指定する必要があります。ない場合は、ON句およびHASH BYリストに、定数値と、「1 as p」のような別名を持つ列を追加する必要があります。
- CALCTYPEおよびOUTPUTのカスタム値によって、COMBINEフェーズからの出力列が制御されます。
- OUTPUTを'COLUMNS'に設定すると、'COMBINE'フェーズから出力される列は、行列ID列(存在する場合)、INT rownum列、VARCHAR(128) rowname列、各入力データ列のREAL列、およびCALCTYPEが'ESSCP'の場合にはc (カウントの略)という名前のBIGINT列、s (合計の略)という名前のREAL列になります。
OUTPUTを'VARBYTE'に設定すると、'COMBINE'フェーズから出力される列は、INT rowname列、VARCHAR(128) rowname列、およびv.という名前のVARBYTE列になります。
- 行列ID列がない場合、COMBINEフェーズの最終出力はn行で構成されます。nは、入力に含まれるデータ列の数です。rownumフィールドの値は1~nです。このため、各出力行は処理の結果得られる行列の1行になります。行列ID列がある場合、COMBINEフェーズの最終出力は行列IDごとにn行で構成されます。rownumフィールドの値は1~nです。
VARBYTE出力
出力が‘VARBYTE’である場合、出力行は行列ID列(ある場合)および次のフィールドで構成されます。
- INT rownum
- VARCHAR(128) rowname
- VARBTYE value
LOCALフェーズとCOMBINEフェーズの両方の詳細
- rownum列の値は1~nであり、nは入力に含まれるデータ列の数です。rownum列の値がxである場合、rowname列はx番目のデータ列名になります。
- ON句の列が式である場合、その列には別名が必要です。LOCAL ORDER BYリストまたはHASH BYリストの列は、ON句からの列か別名、または順序数である必要があります。