3

私はAに保存されたタプルを持っています:

{group: chararray,word_count: long}

したがって、すべての word_count 変数を合計し、変数 T に格納します。

T: {long}

今、次のような変数 X があります。

(word1,12,word1,1)
(word2,22,word2,4)
(word3,32,word3,14)

Tに格納されている値に対して1、4、および14で数学演算を行う必要がありますが、for eachはTを認識しません。

result = FOREACH X GENERATE $3*T;

失敗します。XにはTというフィールドがないため、Tを認識しません。

だから、私がしたことは、私は X と T を交差させます temp = CROSS X, T

これは正しい方法ですか?? 私は豚が初めてです。私の解決策は、あまりエレガントではないようです。

4

1 に答える 1

1

残念ながら、あなたが選択した方法は、これを行うための最良の方法です。Pig には、スタンドアロン変数の概念がありません。あなたが単一の変数だと思っているものは、T実際には 1 つのフィールドを持つ単一のタプルを持つ関係です。Pig は一度に 1 つのレコードを操作します。データの一部がそのレコードまたは内部パラメーター (%DEFAULTまたはコマンド ライン パラメーターで定義されたもの) で使用できない場合、それを使用することはできません。

私があなたのアプローチに加えたい1つの修正は、使用CROSSすると2つの関係が読み取られ、クロス積が実行され、それがディスクに書き戻されるということです。これは資源の無駄です。JOIN代わりに、特別なディレクティブを使用して活用できますUSING 'replicated'。これにより、データをレデューサーに送信して結合を実行し、ディスクに書き込むのではなく、2 番目のリレーションをメモリに格納し、マップ フェーズで結合を実行するように Pig に指示します。

temp = JOIN X BY 1, T BY 1 USING 'replicated';

ダミー値で結合する1JOIN、 a と同等になりCROSSます。USING 'replicated'マップフェーズTで実行できるようにメモリに配置し、隣接する MR ジョブと組み合わせることができます。

于 2013-10-27T03:40:46.283 に答える