Pig-试图避免交叉

vfh0ocws  于 2021-06-04  发布在  Hadoop
关注(0)|答案(2)|浏览(423)

我将参考我以前的问题。基本上我有这两个数据集。使用场馆名称,我想输出每个场馆在tweet消息中出现的次数。我得到的答案对于小数据集来说是很好的,但是假设我有10000个场地和20000条tweet消息 CROSS 将给我一个200米的记录,这是相当多的关系。
简单的数据集在上一个问题中给出,我现在使用的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
jc3wubiy

jc3wubiy1#

你可以选择“按地点加入推特,按城市加入推特”,而不是交叉。
再来一次:
我能想到的最好的方法是“编写加载所有10k场馆的自定义项,并编译一个包含所有场馆名称的正则表达式模式(应该适合主内存=10k*500字节)。udf将接收tweet消息并输出匹配场馆的名称。对于每条tweet消息,您将称之为这个udf。因为在每个Map绘制者中加载10k场馆需要时间,所以您可能需要向每个Map绘制者发送更多推文消息,否则您将花费大部分时间加载场馆。我认为这样做的真正好处是没有产生2亿的中间产量。

z4bn682m

z4bn682m2#

udf的性能可能更好,它可以预先加载数据并直接输出数据。但既然你要求一个没有自定义项的解决方案。您可以执行片段复制联接,因为您的表非常小。

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

现在您可以投影 joined 与你感兴趣的领域的关系。所建议的udf基本上是对复制连接算法的优化。事实上,现在我想起来了,在一个udf中,它可能不会有更多(或更少)的表现。我猜执行计划将保持不变。你可以尝试这两种方法,看看哪一种更好。

相关问题