foreach
一連の式をデータセットの各行に適用します。このアクションは、射影と呼ばれることもあります。
構文
1q = foreach q generate expression as alias[, expression as alias ...];出力列名は、as キーワードで指定されます。出力データはグループ化されません。
グループ化されていないデータでの foreach の使用
グループ化されていないデータで使用すると、foreach ステートメントは入力行を出力行に対応付けます。行数は同じままです。
例
a2 = foreach a1 generate carrier as carrier, miles as miles;
グループ化されたデータでの foreach の使用
グループ化されたデータで使用すると、foreach ステートメントはグループ化されていないデータの場合とは異なる動作をします。
項目は、その値がすべてのグループメンバーで同じ場合にのみ、直接アクセスできます。たとえば、グルーピングキーとして使用された項目の値がすべてのグループメンバーで同じ場合などです。同じではない場合は、集計関数を使用してグループのメンバーにアクセスします。列の型によって、使用できる集計関数が決まります。たとえば、列の型が数値の場合、sum() 関数を使用できます。
例
z = foreach y generate day as day, unique(origin) as uorg, count() as n;
case 式での foreach の使用
いずれかの条件ステートメントを選択する foreach ステートメントでロジックを作成するには、case 式を使用します。
例
次のクエリ例では、単純な case 式構文が使用されています。
1q = load "data";
2q = foreach q generate xInt, (case xInt % 3
3 when 0 then "3n"
4 when 1 then "3n+1"
5 else "3n+2"
6end) as modThree;例
次のクエリ例では、検索 case 式構文が使用されています。
1q = load "data";
2q = foreach q generate price, (case
3 when price < 1000 then "category1"
4 when price >= 1000 and price < 2000 then "category2"
5 else "category3"
6end) as priceLevel;一意の名前の使用
射影で名前を複数回使用するとエラーが発生します。
たとえば、次のクエリの最終行は無効で、エラーが発生します。
1l = load "0Fabb000000002qCAA/0Fabb000000002WCAQ";
2r = load "0Fcyy000000002qCAA/0Fcyy000000002WCAQ";
3l = foreach l generate 'value'/'divisor' as 'value' , category as category;
4r = foreach r generate 'value'/'divisor' as 'value' , category as category;
5cg = cogroup l by category right, r by category;
6cg = foreach cg generate r.category as 'category', sum(r.value) as sumrval, sum(l.value) as sumrval;