我有这样的数据:
2013-11 localhost kern
2013-11 localhost kern
2013-11 192.168.0.59 daemon
2013-12 localhost kern
2013-12 localhost daemon
2013-12 localhost mail
你明白了。我正在尝试按日期(作为行键)对上面的内容进行分组,并有一列对应于每个列的计数 kern
, daemon
简而言之,我想要的输出应该如下:
-- date, count(kern), count(daemon), count(mail)
(2013-11, 2, 1, 0)
(2013-12, 1, 1, 1)
目前,我的方法是这样的。
valid_records = FILTER formatted_records BY date is not null;
date_group = GROUP valid_records BY date;
facilities = FOREACH date_group {
-- DUMB way to filter for now :(
kern = FILTER valid_records BY facility == 'kern';
user = FILTER valid_records BY facility == 'user';
daemon = FILTER valid_records BY facility == 'daemon';
-- this need to be in order so it get mapped correctly to HBase
GENERATE group, COUNT(kern), COUNT(user), COUNT(daemon);
}
两个问题:
我有3个过滤器在上面,但在生产中,应该有超过10个过滤器。如果我使用了很多 FILTER
像上面那样?
还有其他更好的方法吗?
2条答案
按热度按时间whlutmcx1#
一旦你有了一个组操作,你就会有一个reduce阶段,这意味着你很可能会有写临时Map器输出、二次排序等的开销。还有其他pig操作符触发reduce阶段,但我不认为
FILTER
是其中之一:mapper任务可以过滤输入并创建多个输出,然后对这些输出进行排序并发送到单个reduce阶段。换句话说,在pig中看起来凌乱的东西实际上可以非常有效,而看起来简洁的东西可以产生比您预期的多得多的map-reduce开销。
如果您从命令行运行pig作业,您将看到正在使用的运算符的摘要和逻辑计划产生的m/r作业的列表。
vngu2lb82#
我认为你的问题是你正在寻找一个带有浮动模式的输出。但似乎您所要做的就是通过一个复合键进行分组:使用以下脚本:
您将获得:
提供了同样的信息。
如果您想以一种像您这样的奇特方式格式化输出,那么最好分别使用一种通用语言(如java或python)来处理这些任务(假设pig的输出足够小,可以放入内存)。Pig不擅长这个。