我有两个文件 - venues.csv和tweets.csv。我想从推文文件的推文消息中计算出每个场所的次数。
我已经在HCatalog中导入了csv文件。
到目前为止我做了什么:
我知道如何过滤text
字段并获取包含'Shell'
个推文消息的元组。我想做同样的事情但不是硬编码的Shell
,而是来自name
行包中的每个venuesNames
。我怎样才能做到这一点?另外,我如何才能正确使用generate
命令生成一个新的包,该包与计数结果和场地名称相匹配?
a = LOAD 'venues_test_1' USING org.apache.hcatalog.pig.HCatLoader();
b = LOAD 'tweets_test_1' USING org.apache.hcatalog.pig.HCatLoader();
venuesNames = foreach a generate name;
countX = FILTER b BY (text matches '.*Shell.*');
venueToCount = generate ('Shell' as venue, COUNT(countX) as countVenues);
DUMP venueToCount;
我正在使用的文件是:
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
我知道这些是基本问题,但我刚刚开始使用猪,任何帮助都将受到赞赏!
答案 0 :(得分:2)
我认为你的场地名单是唯一的。如果没有,那么你还有更多问题,因为你需要消除所讨论的场所的歧义(可能参考城市领域)。但是无视这种潜在的并发症,你可以做到这一点:
您已经描述了模糊连接。在Pig中,如果没有办法强制您的记录包含标准值(在这种情况下,没有不依赖UDF),您需要使用CROSS
运算符。请谨慎使用,因为如果您使用M
和N
记录交叉两个关系,结果将与M*N
记录建立关系,这可能超出您的系统可以处理的范围。
一般策略是1)CROSS
两个关系,2)为每个记录*创建自定义正则表达式,3)过滤那些通过正则表达式的正则表达式。
venues = LOAD 'venues_test_1' USING org.apache.hcatalog.pig.HCatLoader();
tweets = LOAD 'tweets_test_1' USING org.apache.hcatalog.pig.HCatLoader();
/* Create the Cartesian product of venues and tweets */
crossed = CROSS venues, tweets;
/* For each record, create a regex like '.*name.*'
regexes = FOREACH crossed GENERATE *, CONCAT('.*', CONCAT(venues::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 venues::name) GENERATE group, COUNT($1);
如果有些推文提到多个场地,那么所有venueCounts
的总和可能会超过推文的数量。
*请注意,您必须对此技术稍加注意,因为如果场地名称包含在Java正则表达式中具有特殊解释的字符,则您需要将它们转义。