0

FOREACH を次のように使用したい:

a:{a_attr:chararray}
b:{b_attr:int}

FOREACH a {
  res = CROSS a, b;
  -- some processing
  GENERATE res;
}

これはa、クロス積の各要素に対して のすべての要素をb作成し、カスタム フィルタリングを実行してタプルを返すことを意味します。

==編集==

カスタム filetering = res_filtered = FILTER res BY ...; res_filtered を生成します。

==EDIT-2== 前の GROUP または COGROUP なしで、入れ子になった CROSS を FOR ループ内で行うにはどうすればよいですか?

4

2 に答える 2

2

aフィルタリングの詳細に応じて、とb、およびJOINそれらの要素のばらばらなクラスの限定セットを設計できる場合があります。例えば:

フィルタリング ルールが

  • a_attr"Foo" で始まり4 の場合b、受け入れる
  • a_attr"Bar" で始まり、b17 より大きい場合は、受け入れる
  • a_attr[mz] の文字で始まり、b0 未満の場合は受け入れます
  • そうでなければ拒否する

次に、最初のルールを満たすアイテムに対して 1 を返し、2 番目のルールに対して 2 を返し、3 番目のルールに対して 3 を返す UDF を作成できますNULL。あなたのCROSS/ FILTERthen は

res = JOIN a BY myUDF(a), b BY myUDF(b);

Pig はJOINs に null 値をドロップするため、フィルタリング基準を満たすペアのみが渡されます。

于 2013-03-19T15:02:16.323 に答える
1

CROSS各リレーションのすべてのタプルの外積を生成します。したがって、入れ子にする必要はありませんFOREACHCROSSそして、次のことを行うだけですFILTER

a: {a_attr: chararray}
b: {b_attr: int}

crossed = CROSS a, b;
crossed: {a::a_attr: chararray,b::b_attr: int}

res = FILTER crossed BY ... -- your custom filtering

FILTERの直後にがある場合、フィルタリングの前にクロス積全体をディスクに書き込むことCROSSによる (不要な) 過度の IO トラブルは発生しないはずです。CROSSフィルタリングされたレコードはまったく書き込まれません。

于 2013-03-19T13:06:56.877 に答える