1

私はPIGスクリプトを実行していますが、FOREACH ... GENERATE FLATTEN(...)ラインに到達するまで、すべてが非常に高速に実行されます。

そのラインがとても遅く走るべきである理由がありますか?(これにより、スクリプト全体がかなり強力なクラスターでタイムアウトになります)

extended = FOREACH kRecords GENERATE *, NORMALIZE(query) AS query_norm:chararray;
-- DESCRIBE extended;
-- extended: {query: chararray,url: chararray,query_norm: chararray}

-- GROUP by both query and url
grouped = GROUP extended BY (query_norm, url);
-- DESCRIBE grouped;
-- grouped: {group: (query_norm: chararray,url: chararray),extended: {(query: chararray,url: chararray,query_norm: chararray)}}

-- Remove multiple items per record (but at the expense of duplicating records)
-- THE LINE BELOW IS THE SLOW ONE!!!
flattened = FOREACH grouped GENERATE FLATTEN(extended.query_norm), FLATTEN(extended.url);
-- THE LINE ABOVE IS THE SLOW ONE!!!

-- Remove duplicates
result = DISTINCT flattened;

ありがとう、バリー

4

1 に答える 1

2

GENERATEの後に2つのFLATTEN(...)演算子を一緒に使用すると、2つのバッグの間にデカルト積が得られます。したがって、GROUPによって生成されたバッグにN個の要素がある場合、同じバッグで2つのFLATTEN(..)オペレーターを実行すると、グループごとにN * N行が生成され、CPU、HDD、およびネットワークに大きな負担がかかる可能性があります。次の例を参照してください。

コード:

inpt = load '/pig_fun/input/group.txt' as (c1, c2);
grp = group inpt by (c1, c2);
flt = foreach grp generate FLATTEN(inpt.c1), FLATTEN(inpt.c2);

入力:

1       a
1       a
1       b
1       b
1       c

出力:

(1,a)
(1,a)
(1,a)
(1,a)
(1,b)
(1,b)
(1,b)
(1,b)
(1,c)

(1、a)の2つのレコードと(1、b)の2つのレコードがそれぞれ4つの出力レコードを引き起こした方法を確認してください。しかし、(1、c)の1つのレコードは、1つの出力レコードしか引き起こしませんでした。

于 2012-06-28T08:35:26.943 に答える