すべてのAMPから最終結合を行なうには、各AMPのローカル結果を集約します。これを行なうには、DATASET_PUBLISHへの2番目の呼び出しをネストします。DATASET_PUBLISHへの内部呼び出しは各AMPでのローカル集約を実行し、外部呼び出しはローカル集約の最終集約を行ない、すべての入力値を表わす単一の結果行を生成します。
PARTITION BY句を定数値(例: 1)とともに使用して、最終的な集約を1つのAMPで実行します。数値1のような定数値を指定することで、各AMPからローカルで集約された行は同じパーティションに含まれるため、最終的な集約で同じAMPに再分散されます。外部クエリーはこの定数でパーティション化されます。例では"1 as p"と示されています。 1つの出力行が返されます。 スキーマを結合するときに重複が発生しないようにUNIQUE_NAMESカスタム句を指定する必要があります。
さらに、ドット表記法を使用して集約結果を参照します。ここで、再帰的下降演算子は内部DATASET_PUBLISHクエリー結果を参照します。次にワイルドカード*で構成される配列参照が続きます。これによって1入力行1レコードで構成される1つの配列を取得します。最終的なクエリーは次のようになります。
select data.getSchema(), data..record[*] FROM DATASET_PUBLISH ( ON (SELECT data as record, 1 as p FROM DATASET_PUBLISH ( ON (SELECT * FROM employeeTable) USING UNIQUE_NAMES('Y') )as L ) partition by p )G;
data.getSchema() |
data..record[*] |
{ "type": "array", "items": { "type": "record", "name": "rec_0", "fields": [{ "name": "record", "type": { "type": "record", "name": "rec_0_1448384735", "fields": [{ "name": "empID", "type": "int" }, { "name": "empName", "type": "string" }, { "name": "empDept", "type": "string" }] } }, { "name": "p", "type": "int" }] } } |
[{ "empID": 5, "empName": "Kyle Newman", "empDept": "Engineering" }, { "empID": 3, "empName": "Steven Mazzo", "empDept": "Engineering" }, { "empID": 1, "empName": "George Smith", "empDept": "Accounting" }, { "empID": 2, "empName": "Pauline Kramer", "empDept": "HR" }, { "empID": 6, "empName": "Pamela Giles", "empDept": "Sales" }, { "empID": 4, "empName": "Jose Hernandez", "empDept": "Engineering" }] |
定数値で区切ることで、すべての値をDATASET_PUBLISHの1回の呼び出しで集約できます。これによってすべての行が1つのAMPに再分散され集約が実行されます。これはデータベースの並列処理機能を利用していません。DATASET_PUBLISHを2回呼び出しすることで、AMPはローカル集約を並行して実行し、1つのAMPで最終集約のみが実行されます。