2013-11-26 47 views
1

我会参考我以前的question。基本上我有这两个数据集。使用场地名称,我想输出每条场地在推文消息中发生的次数。我得到的答案适用于小数据集,但想象一下,我有10000个场所,使用CROSS的20000条推文消息会给我一个与200米记录的关系,这是相当多的。猪 - 试图避免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城市” CROSS的。

闯闯:

我能想到的就是最好的“要写出UDF,它加载的所有10K场馆和编译所有场馆名称之一正则表达式模式(应该适合在主内存= 10K * 500bytes)的UDF。会把tweet消息和输出的名字匹配起来,对于每条推文消息你都会调用这个UDF,因为在每个mapper中加载10K场地需要时间,你可能想给每个mapper提供更多tweet消息,否则你将花费大部分时间都是在加载场地的时候,我认为你真正获得的是不会产生200M的中间输出

+0

是的,但这样我只会计算发生的事件,如果场地是在发布在同一个城市的推文中提到的,这个场地应该不是这种情况。 –

+0

编辑答案 - 添加“另一个尝试:” –

+0

好吧,看来这将是我的第一个UDF:)你的解决方案听起来很合理。但是,如果有人提出没有UDF的解决方案,欢迎分享。 –

1

UDF可能是更好的性能前加载你的d阿塔和直接输出场地。但是因为您要求没有UDF的解决方案。你可以做一个片段复制连接,因为你的场馆表非常小。

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

现在,您可以用投影你感兴趣的领域的joined关系。建议的UDF基本上是复制连接算法的优化。事实上,现在我想到了它,在UDF中可能没有更多(或更少)的性能。我的猜测是执行计划将保持完全一样。你可以尝试两种方法,看看哪一种更好。