2013-11-26 7 views
1

Я расскажу о своих предыдущих question. В основном у меня эти два набора данных. И используя имена места размещения, я хочу вывести, сколько раз каждое место происходило в сообщениях твита. Ответ, который я получаю, хорош для небольших наборов данных, но представьте, что у меня есть 10000 мест и 20000 сообщений в твиттере, используя CROSS, что даст мне отношение с 200m records, что довольно много.Свинья - попытка избежать 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'); 

tweets.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 

venues.csv

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

ответ

3

Вместо КРЕСТА вы можете захотеть сделать "JOIN твиты BY месте, места в городе".

Другая попытка:

Лучшее, что я могу думать о «Для того, чтобы написать UDF, который загружает все 10K места и составить один регулярное выражение всех имен место проведения (должен вписываться в основной памяти = 10К * 500bytes) ОДС. будет принимать сообщение о твите и имя вывода согласованного места. Для каждого сообщения в твиттере вы будете называть этот UDF. Поскольку загрузка мест 10K в каждом картографе потребует времени, вы можете захотеть дать больше сообщений твита каждому картографу, иначе вы будете тратить большую часть вашего времени в загрузке мест. Я думаю, что вы действительно набираете, делая это, не производя этого промежуточного выхода 200M.

+0

Да, но в этом случае я засчитываю только случаи, когда место встречи упоминается в твиттере, опубликованном в том же городе, где находится это место, что не должно быть. –

+0

отредактировал ответ-добавить «Еще одна попытка:« –

+0

Хорошо, так что кажется, что это будет мой первый UDF, тогда:) ваше решение звучит разумно. Однако, если кто-то придумает решение без UDF, более чем можно поделиться с ним. –

1

UDF может быть лучше, если вы загрузите свой d ata и непосредственно выводят места. Но так как вы запросили решение без UDF. Вы можете сделать повторное объединение фрагментов, так как таблица ваших мест очень мала.

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

Теперь вы можете проецировать joined связи с полями вы заинтересованы в. Предложенное UDF в основном оптимизация реплицированного присоединиться алгоритм. Фактически, теперь, когда я думаю об этом, это может быть не более (или менее) для этого в UDF. Я предполагаю, что план выполнения останется таким же. Вы можете попробовать оба подхода и посмотреть, какой из них лучше.

Смежные вопросы