1

我会参考我之前的问题。基本上我有这两个数据集。并使用场地名称,我想输出每个场地在推文中出现的次数。我得到的答案对小型数据集很有用,但想象一下我有 10000 个场所和 20000 条推文消息,这CROSS将给我与200m 条记录的关系,这是相当多的。

上一个问题中介绍了简单的数据集,我目前使用的 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,您可能想做“按地点、按城市的场所加入推文”。

另一个尝试:

我能想到的最好的方法是“编写加载所有 10K 场地的 UDF 并编译所有场地名称的一个正则表达式模式(应该适合主内存 = 10K * 500 字节)。UDF 将获取推文消息并输出场地名称匹配。对于每条推文消息,您将调用此 UDF。因为在每个映射器中加载 10K 场所需要时间,您可能希望向每个映射器提供更多推文消息,否则您将花费​​大部分时间来加载场所。我认为通过这样做,您真正获得的并不是产生 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 回答