5

私は2つの豚の関係に関係する豚のスクリプトを持っています。たとえばAとBです。Aは小さな関係で、Bは大きな関係です。私のUDFは、すべてのAを各マシンのメモリにロードし、Bの処理中に使用する必要があります。現在、私はこのようにしています。

A = foreach smallRelation Generate ...
B = foreach largeRelation Generate propertyOfB;
store A into 'templocation';
C = foreach B Generate CustomUdf(propertyOfB);

次に、「templocation」からすべてのマシンをロードしてAを取得します。これは機能しますが、2つの問題があります。

  1. 私の理解では、どういうわけかHDFSキャッシュを使用する必要がありますが、関係をHDFSキャッシュに直接ロードする方法がわかりません。
  2. UDFにファイルをリロードすると、バッグとタプルを直接使用したいときにファイルに出力されたAからの出力を解析するロジックを作成する必要がありました(文字列を解析してバッグに戻すための組み込みのPig java関数はありますか? /タプルフォーム?)。

誰かがそれがどのように行われるべきか知っていますか?

4

1 に答える 1

1

これがあなたのために働くトリックです。

最初に A で GROUP ALL を実行します。これにより、A のすべてのデータが 1 つのフィールドに「バッグ」されます。次に、A と B の両方に人為的に共通のフィールドを追加し、それらを結合します。このようにして、強化された B の各タプルに対して、UDF が使用する A の完全なデータが得られます。

こんな感じです:

(もともと A にはフィールド fa1、fa2、fa3 があり、B には fb1、fb2 があるとします)

-- add an artificial join key with value 'xx'
B_aux = FOREACH B GENERATE 'xx' AS join_key, fb1, fb2;
A_all = GROUP A ALL;
A_aux = FOREACH A GENERATE 'xx' AS join_key, $1;
A_B_JOINED = JOIN B_aux BY join_key, A_aux BY join_key USING 'replicated';

C = FOREACH A_B_JOINED GENERATE CustomUdf(fb1, fb2, A_all);

これはレプリケートされた結合であるため、マップ側の結合のみでもあります。

于 2013-03-15T06:15:15.683 に答える