1

以前の質問を参照します。基本的に、これら2つのデータセットがあります。そして、会場名を使用して、ツイートメッセージで各会場が何回発生したかを出力したいと思います。私が得た答えは小さなデータ セットには適していましたが、10000 の会場と 20000 のツイート メッセージを使用して200m のレコードCROSSとの関係が得られると想像してください。

単純なデータ セットは前の質問で提示されており、現在使用している PIG スクリプトは回答で提案されているとおりです。製品なしでこのカウントを行う方法のアイデアを探していCROSSます。ありがとう!

REGISTER piggybank.jar
venues = LOAD 'venues_mid' USING org.apache.hcatalog.pig.HCatLoader();
tweets = LOAD 'tweets_mid' USING org.apache.hcatalog.pig.HCatLoader();

tweetsReduced = foreach tweets generate text;
venuesReduced = foreach venues generate name;

/* Create the Cartesian product of venues and tweets */
crossed = CROSS venuesReduced, tweetsReduced;

/* For each record, create a regex like '.*name.*' */
regexes = FOREACH crossed GENERATE *, CONCAT('.*', CONCAT(venuesReduced::name, '.*')) AS regex;


/* Keep tweet-venue pairs where the tweet contains the venue name */
venueMentions = FILTER regexes BY text MATCHES regex;

venueCounts = FOREACH (GROUP venueMentions BY venuesReduced::name) GENERATE group, COUNT($1) as counter;
venueCountsOrdered = order venueCounts by counter;

STORE venueCountsOrdered INTO 'Pig_output/venueCountsOrdered_mid.csv'
USING org.apache.pig.piggybank.storage.CSVExcelStorage(',', 'NO_MULTILINE', 'WINDOWS');

つぶやき.csv

created_at,text,location
Sat Nov 03 13:31:07 +0000 2012, Sugar rush dfsudfhsu, Glasgow
Sat Nov 03 13:31:07 +0000 2012, Sugar rush ;dfsosjfd HAHAHHAHA, London
Sat Apr 25 04:08:47 +0000 2009, at Sugar rush dfjiushfudshf, Glasgow
Thu Feb 07 21:32:21 +0000 2013, Shell gggg, Glasgow
Tue Oct 30 17:34:41 +0000 2012, Shell dsiodshfdsf, Edinburgh
Sun Mar 03 14:37:14 +0000 2013, Shell wowowoo, Glasgow
Mon Jun 18 07:57:23 +0000 2012, Shell dsfdsfds, Glasgow
Tue Jun 25 16:52:33 +0000 2013, Shell dsfdsfdsfdsf, Glasgow

会場.csv

city,name
Glasgow, Sugar rush
Glasgow, ABC
Glasgow, University of Glasgow
Edinburgh, Shell
London, Big Ben
4

2 に答える 2

3

CROSS の代わりに、「JOIN tweets BY location、venues BY city」を実行したい場合があります。

別の試み:

私が考えることができる最善の方法は、「10Kの会場すべてをロードし、すべての会場名の1つの正規表現パターンをコンパイルするUDFを作成することです(メインメモリに収まる必要があります= 10K * 500バイト)。UDFはツイートメッセージを受け取り、会場の名前を出力します。各ツイート メッセージに対して、この UDF を呼び出します.各マッパーで 10,000 の会場を読み込むには時間がかかるため、各マッパーにより多くのツイート メッセージを送信する必要があるかもしれません。これを行うことで実際に得られるのは、200M の中間出力を生成しないことです。

于 2013-11-26T16:58:55.333 に答える
1

UDF は、データをフロントロードし、会場を直接出力することでパフォーマンスが向上する場合があります。しかし、UDF なしでソリューションを要求したためです。会場テーブルが非常に小さいため、フラグメント複製結合を実行できます。

tweets = LOAD 'tweets';
venues = LOAD 'venues';
joined = JOIN tweets by location, venues by city using 'replicated';

これjoinedで、関心のあるフィールドとの関係を射影できます。提案された UDF は、基本的に複製された結合アルゴリズムの最適化です。実際、今考えてみると、UDF でのパフォーマンスはこれ以上 (または以下) ではない可能性があります。私の推測では、実行計画はまったく同じままです。両方のアプローチを試して、どちらが優れているかを確認できます。

于 2013-11-27T06:29:59.547 に答える