Hadoop 将行值聚合到列中

Hadoop 将行值聚合到列中,hadoop,apache-pig,Hadoop,Apache Pig,我有这样的数据: 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、d

我有这样的数据:

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个过滤器。如果我像上面那样使用大量的
    过滤器
    ,是否会影响性能

  • 还有其他更好的方法吗


  • 一旦有了组操作,就会有一个reduce阶段,这意味着您很可能会有编写临时映射器输出、二次排序等的开销。还有其他pig操作符会触发reduce阶段,但是我不认为
    FILTER
    是其中之一:mapper任务可以过滤输入并创建多个输出,然后对这些输出进行排序并发送到单个reduce阶段

    换句话说,在pig中看起来凌乱的东西实际上可以非常有效,而看起来简洁的东西可以产生比您预期的多得多的映射减少开销


    如果您从命令行运行pig作业,您将看到正在使用的运算符的摘要以及逻辑计划产生的M/R作业列表。

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

    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不擅长于此。

    谢谢,因此在这种情况下,我的将生成两个简化阶段,一个是在使用
    组时,另一个是在
    生成最终结果时,不是吗?我想我可以接受它有一个临时映射器输出,我只是担心如果我有10个
    过滤器,它的性能会受到很大的影响。大量的map stage是否也会降低性能?我需要每30分钟运行一次。我想不出任何其他方法来获得最终输出。但如果这足够好,我可以接受。我可以这样做,但问题是当我将数据存储到HBase中时,数据会被重写/覆盖,因为它们具有相同的密钥,即2013-11。我需要按年份和月份访问数据,因此2013-11是关键,这样我可以在相应的列中获得所有信息。我对这个很陌生,我来自RDBMS背景。我已经使用Java编写了自定义MR,但与Pig相比,Pig更易于管理。我的意思是,您必须在管道中加入一个中间步骤:用于重载的Pig作业->用于以您想要的方式格式化数据(Pig的输出)的Python/Java/etc脚本->放入HBase/任何内容。