group および cogroup
一致したレコードをグループ化します。group および cogroup ステートメントは代替可能です。ただし、cogroup は通常、複数の入力ストリームに対する操作に使用されます。
構文
1result = group rows by field;
2result = group rows by (field1, field2, ...);
3result = group rows by expression[, rows by expression ...];
4result = group rows by expression [left | right | full], rows by expression;単純なグルーピング
1 つ以上の列をグループに追加します。データをグループ化基準となる値が行内で null の場合、その行全体が結果から削除されます。
構文:
1result = group rows by field;または
1result = group rows by (field1, field2, ...);1 ディメンションによるグループ化は次のようになります。
a = group a by year;複数のディメンションによるグループ化は次のように���ります。
1a = load "0Fbxx000000002qCAA/0Fcxx000000002WCAQ";
2a = group a by (year, month);
3a = foreach a generate year as year, month as month;内部共通グルーピング
共通グルーピングとは、左と右と呼ばれる 2 つの入力ストリームが独立してグループ化され、横に並べて配置されることを意味します。両方のグループに存在するデータのみが結果に表示されます。
構文:
1result = cogroup rows by expression[, rows by expression ...];次の例は、2 つのデータセットに対する単純な cogroup 操作です。
1a = load "0Fbxx000000002qCAA/0Fcxx000000002WCAQ";
2b = load "0Fbyy000000002qCAA/0Fcyy000000002WCAQ";
3a = cogroup a by carrier, b by carrier;3 つ以上のデータセットを共通グループ化できます。
1result = cogroup a by keya, b by keyb, c by keyc;次の例では、cogroup 操作を実行します。
1z = cogroup x by (day,origin), y by (day,airport);
cogroup 操作の両側を同じストリームにすることはできません。1 つのデータセットに対して cogroup 操作を実行するには、データセットを 2 回読み込んで 2 つのストリームにします。
1 つのデータセットを読み込み、filter 操作を実行して 2 つの異なるストリームに分けることもできます。
1a = load "0Fbxx000000002qCAA/0Fcxx000000002WCAQ";
2b = load "0Fbxx000000002qCAA/0Fcxx000000002WCAQ";
3b = cogroup a by ClosedDate, b by CreatedDate;
4c = foreach b generate sum(a.Amount) as Amount;1a = load "0Fbxx000000002qCAA/0Fcxx000000002WCAQ";
2a = filter a by "region" in ["West"];
3a = filter a by "status" in ["closed"];
4b = filter a by "year" in [2014];
5c = filter a by "year" in [2015];
6d = cogroup b by ("state"), c by ("state");
7d = foreach d generate "state" as "state", sum(b.Amount) as "Amount_2014", sum(c.Amount) as "Amount_2015";次のコードでは、1 つのストリーム a に対して cogroup 操作を実行するため、エラーが発生します。
1a = load "0Fbxx000000002qCAA/0Fcxx000000002WCAQ";
2b = cogroup a by ClosedDate, a by CreatedDate;
3c = foreach b generate sum(a.Amount) as Amount;共通グルーピング時に集計関数を使用するには、どちらの入力側を集計関数で使用するかを指定します。たとえば、a 側と b 側があり、それぞれに特定の基準が含まれる場合は、次のいずれかの構文を使用します。
1sum(inputSide['myMeasure'])
2sum(inputSide::myMeasure)
3sum(inputSide.myMeasure)次のクエリは、3 つ目の構文形式を使用して a 側からの miles を指定しているため、有効です。
1a = load "0Fbxx000000002qCAA/0Fcxx000000002WCAQ";
2b = load "0Fbyy000000002qCAA/0Fcyy000000002WCAQ";
3c = cogroup a by x, b by y;
4d = foreach c generate a.x as x, a.y as y, sum(a.miles) as miles;次のクエリは、miles にどちら側から入力するかを指定していないため、無効です。
1a = load "0Fbxx000000002qCAA/0Fcxx000000002WCAQ";
2b = load "0Fbyy000000002qCAA/0Fcyy000000002WCAQ";
3c = cogroup a by x, b by y;
4d = foreach c generate a.x as x, a.y as y, sum(miles) as miles;レンズまたはダッシュボードに cogroup クエリがある場合、次の例のように照影用と cogroup クエリでの count() 集計用の入力ストリームを指定します。
1a = load "0Fbxx000000002qCAA/0Fcxx000000002WCAQ";
2b = load "0Fbyy000000002qCAA/0Fyy000000002WCAQ";
3c = cogroup a by 'OwnerName', b by 'OwnerName';
4c = foreach c generate a['OwnerName'] as 'OwnerName', sum(a['AmountConverted']) /
5 sum(b['Amount']) as 'sum_target_completed', count(a) as count;外部共通グルーピング
外部共通グルーピングでは、グループを外部結合として結合します。一方だけ一致した場合は、null 行が追加されます。グルーピングキーは、値を提供する入力から取得されます。
構文:
1result = cogroup rows by expression [left | right | full], rows by expression;left、right、または full を指定して、左外部結合、右外部結合、完全結合のいずれを実行するかを指定します。
例: z = cogroup x by (day,origin) left, y by (day,airport);
外部共通グルーピングを 3 つ以上のデータセットに適用できます。次の例では、a から b に左外部結合を実行し、c に右結合しています。
result = cogroup a by keya left, b by keyb right, c by keyc;