すべての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で最終集約のみが実行されます。