将行值聚合到列中

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

我有这样的数据:

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 像上面那样?
还有其他更好的方法吗?

whlutmcx

whlutmcx1#

一旦你有了一个组操作,你就会有一个reduce阶段,这意味着你很可能会有写临时Map器输出、二次排序等的开销。还有其他pig操作符触发reduce阶段,但我不认为 FILTER 是其中之一:mapper任务可以过滤输入并创建多个输出,然后对这些输出进行排序并发送到单个reduce阶段。
换句话说,在pig中看起来凌乱的东西实际上可以非常有效,而看起来简洁的东西可以产生比您预期的多得多的map-reduce开销。
如果您从命令行运行pig作业,您将看到正在使用的运算符的摘要和逻辑计划产生的m/r作业的列表。

vngu2lb8

vngu2lb82#

我认为你的问题是你正在寻找一个带有浮动模式的输出。但似乎您所要做的就是通过一个复合键进行分组:使用以下脚本:

formatted_records = LOAD 'input' AS (date: chararray, host: chararray, facility: chararray);
valid_records = FILTER formatted_records BY date is not null;
counts = FOREACH (GROUP valid_records BY (date, facility)) GENERATE
        group.date AS date,
        group.facility AS facility,
        COUNT(valid_records) AS the_count;
DUMP counts;

您将获得:

(2013-11,kern,2)
(2013-11,daemon,1)
(2013-12,kern,1)
(2013-12,mail,1)
(2013-12,daemon,1)

提供了同样的信息。
如果您想以一种像您这样的奇特方式格式化输出,那么最好分别使用一种通用语言(如java或python)来处理这些任务(假设pig的输出足够小,可以放入内存)。Pig不擅长这个。

相关问题