2

ApachePIGを使用して結合する必要のあるファイルを作成する必要があります。最初のファイルには、このような本のタイトルのリストが含まれており、各タイトルはそれ自体で行にあります。

Ted Dunning,  Mahout in Action
Leo Tolstoy,  War and Peace
Douglas Adams, The hitchhiker guide to the galaxy.
James Sununu,  galaxy III for Dummies
Tom McArthur,  The War we went to

2番目のファイルは単語とそのIDのリストです。このような

ted, 12
tom, 13
douglas, 14
galaxy, 15
war, 16
leo, 17
peace, 18

次のような出力を生成するには、これら2つのファイルを結合する必要があります。

「LeoTolstoy、Warandpiece」という行の場合は

17:1,16:1,18:1

「トム・マッカーサー、私たちが行った戦争」という行については、

13:1,16:1

つまり、単語をキーとして結合を実行する必要があります。これまでのところ、私は豚で次のコードを書いています

titles = LOAD 'Titles' AS ( title : chararray );  
termIDs = LOAD  'TermIDs' AS (  term:chararray,id:int);

A = SAMPLE titles 0.01;
X = FOREACH A GENERATE STRSPLIT(title,'[ _\\[\\]\\/,\\.\\(\\)]+');

これにより、両方のファイルがロードされ、Xには、対応する行に出現する用語を含む各バッグのバッグのリストが含まれます。このような:

((ted,dunning,mahout,in,action))
((leo,tolstoy,war,and,peace))

土曜日の夜遅くなるため、UDFを作成するか、ストリーミングを使用しないと、JOINステップへの道を見つけることができません。PIGプリミティブのみを使用して実行することも可能ですか。

4

1 に答える 1

5

TOKENIZE の結果を FLATTEN できるため、すべてのバッグが行になり、termsID を使用して X リレーションを結合できます。

X = foreach A generate title, flatten(TOKENIZE(title)) as term;
J = join X by (term),  termIDs by (term);
G = group J by title;
Result = foreach G generate group as title, termIDs.id;

上記のコードは携帯電話で入力したため、デバッグされませんでした。

更新 1:

TOKENIZE の代わりに STRSPLIT を使用する方が望ましい場合は、FLATTEN と TOBAG を組み合わせて、STRSPLIT によって返されるタプルから単語のバッグを取得する TOKENIZE と同じ効果を得ることができます。

SPLT = foreach A generate title, FLATTEN(STRSPLIT(title,'[ _\\[\\]\\/,\\.\\(\\)]+'));
X_tmp = foreach SPLT generate $0 as title, FLATTEN(TOBAG($1..$20)) as term; -- pivots the row
X = filter X_tmp by term is not null; -- this removes the extra bag rows when title was split in less than 20 terms
J = join X by (term),  termIDs by (term) using 'replicated';
G = group J by title;
Result = foreach G generate group as title, termIDs.id;

いずれかのタイトルが 20 語を超える場合は、TOBAG の数を増やしてください。

于 2012-09-24T15:57:53.243 に答える