2

次のように、さまざまなサイズのタプルのバッグで構成される conversations_grouped という関係があります。

DUMP conversations_grouped:
...
({(L194),(L195),(L196),(L197)})
({(L198),(L199)})
({(L200),(L201),(L202),(L203)})
({(L204),(L205),(L206)})
({(L207),(L208)})
({(L271),(L272),(L273),(L274),(L275)})
({(L276),(L277)})
({(L280),(L281)})
({(L363),(L364)})
({(L365),(L366)})
({(L666256),(L666257)})
({(L666369),(L666370),(L666371),(L666372)})
({(L666520),(L666521),(L666522)})

各 L[0-9]+ は、文字列に対応するタグです。たとえば、L194 は「こんにちは、お元気ですか?」のようになります。L195は「元気ですか?」かもしれません。この対応は、line_map と呼ばれるマップによって維持されます。サンプルは次のとおりです。

DUMP line_map;
...
([L666324#Do you think she might be interested in  someone?])
([L666264#Well that's typical of Her Majesty's army. Appoint an engineer to do a soldier's work.])
([L666263#Um. There are rumours that my Lord Chelmsford intends to make Durnford Second in Command.])
([L666262#Lighting COGHILL' 5 cigar: Our good Colonel Dumford scored quite a coup with the Sikali Horse.])
([L666522#So far only their scouts. But we have had reports of a small Impi farther north, over there. ])
([L666521#And I assure you, you do not In fact I'd be obliged for your best advice. What have your scouts seen?])
([L666520#Well I assure you, Sir, I have no desire to create difficulties. 45])
([L666372#I think Chelmsford wants a good man on the border Why he fears a flanking attack and requires a steady Commander in reserve.])
([L666371#Lord Chelmsford seems to want me to stay back with my Basutos.])
([L666370#I'm to take the Sikali with the main column to the river])
([L666369#Your orders, Mr Vereker?])
([L666257#Good ones, yes, Mr Vereker. Gentlemen who can ride and shoot])
([L666256#Colonel Durnford... William Vereker. I hear you 've been seeking Officers?])

私が今やろうとしているのは、各行を解析し、L[0-9]+ タグを line_map の対応するテキストに置き換えることです。Pig FOREACH ステートメント内から line_map への参照を作成することは可能ですか?

4

1 に答える 1

1

これに関する最初の問題は、マップではキーが引用符で囲まれた文字列でなければならないことです。したがって、スキーマ値を使用してマップにアクセスすることはできません。EG これは機能しません。

C: {foo: chararray, M: [value:chararray]}
D = FOREACH C GENERATE M#foo ;

頭に浮かぶ解決策は、conversations_grouped をフラット化することです。次に、L[0-9]+ タグで conversations_grouped と line_map を結合します。次のステップを高速化するために、いくつかの余分なフィールド (結合後の L[0-9]+ タグなど) を射影したいと思うでしょう。その後、データを再グループ化し、正しい形式に変換する必要があります。

これは、各バッグが再グループ化のための独自の一意の ID を持っていない限り機能しませんが、L[0-9]+ タグのそれぞれが 1 つのバッグ (会話) にのみ表示される場合は、これを使用して一意の ID を作成できます。

-- A is dumped conversations_grouped

B = FOREACH A {
    -- Pulls out an element from the bag to use as the id
    id = LIMIT tags 1 ;
    -- Flattens B into id, tag form.  Each group of tags will have the same id.
    GENERATE FLATTEN(id), FLATTEN(tags) ; 
    } 

B のスキーマと出力は次のとおりです。

B: {id: chararray,tags::tag: chararray}
(L194,L194)
(L194,L195)
(L194,L196)
(L194,L197)
(L198,L198)
(L198,L199)
(L200,L200)
(L200,L201)
(L200,L202)
(L200,L203)
(L204,L204)
(L204,L205)
(L204,L206)
(L207,L207)
(L207,L208)
(L271,L271)
(L271,L272)
(L271,L273)
(L271,L274)
(L271,L275)
(L276,L276)
(L276,L277)
(L280,L280)
(L280,L281)
(L363,L363)
(L363,L364)
(L365,L365)
(L365,L366)
(L666256,L666256)
(L666256,L666257)
(L666369,L666369)
(L666369,L666370)
(L666369,L666371)
(L666369,L666372)
(L666520,L666520)
(L666520,L666521)
(L666520,L666522)

タグが一意であると仮定すると、残りは次のように行われます。

-- A2 is line_map, loaded in tag/message pairs instead of a map

-- Joins conversations_grouped and line_map on tag
C = FOREACH (JOIN B by tags::tag, A2 by tag)
    -- This generate removes the tag
    GENERATE id, message ;

-- Regroups C on the id created in B
D = FOREACH (GROUP C BY id) 
    -- This step limits the output to just messages
    GENERATE C.(message) AS messages ;

D からのスキーマと出力:

D: {messages: {(A2::message: chararray)}}
({(Colonel Durnford... William Vereker. I hear you 've been seeking Officers?),(Good ones, yes, Mr Vereker. Gentlemen who can ride and shoot)})
({(Your orders, Mr Vereker?),(I'm to take the Sikali with the main column to the river),(Lord Chelmsford seems to want me to stay back with my Basutos.),(I think Chelmsford wants a good man on the border Why he fears a flanking attack and requires a steady Commander in reserve.)})
({(Well I assure you, Sir, I have no desire to create difficulties. 45),(And I assure you, you do not In fact I'd be obliged for your best advice. What have your scouts seen?),(So far only their scouts. But we have had reports of a small Impi farther north, over there. )})

注:最悪の場合 (L[0-9]+ タグが一意でない場合)、入力ファイルの各行に連続する整数 ID を指定してから、それを pig にロードできます。

更新: pig 0.11 を使用している場合は、RANK演算子も使用できます。

于 2013-07-17T03:54:19.453 に答える