"Aggregate Function" Pig UDFと書いてください(「集計関数」までスクロールしてください)。これは、バッグを取り、スカラーを出力するユーザー定義の関数です。基本的に、あなたのUDFはバッグを取り込み、複数のアイテムがあるかどうかを判断し、それに応じてifステートメントで変換します。
私はUDFなしでこれを行う方法を考えることができますが、間違いなく厄介です。あなたのGROUP
後、2に設定してデータを分割するSPLIT
を使用します。カウントはカウントが複数である1と1である1ここで:
SPLIT grouped INTO one IF COUNT(fruit) == 0, more IF COUNT(fruit) > 0;
その後、個別に変換するために、それぞれにFOREACH ... GENERATE
を使用します。最後に
one = FOREACH one GENERATE name, MAX(fruit); -- hack using MAX to get the item
more = FOREACH more GENERATE name, 'Multiple';
、組合それらをバック:
out = UNION one, more;
は、私は本当に同じダを渡すのより良い方法を発見していませんあなたが望むように、いくつかの条件に基づいて2つの異なる方法で設定されます。私はここでやったように、通常、ある種の分割/再結合をします。私はピッグがスマートで1 M/R以上の仕事を使わない計画を立てると信じています。
免責事項:現時点でこのコードを実際にテストすることはできないため、間違いがある可能性があります。
更新:
難しく見ると、私はbicond operatorを思い出すと、私はそれがここで働くだろうと思いました。
b = FOREACH a GENERATE name, (COUNT(fruit)==1 ? MAX(FRUIT) : 'Multiple');
私はこの問題はに似ていることに注意してください、私は尋ねた、別の質問とは区別する必要がありますhttp://stackoverflow.com/questions/7406522/is-it-possible-to-cross-join-a豚の中に入れられているのとの関係で/ –