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);
}
两个问题:
过滤器
,是否会影响性能一旦有了组操作,就会有一个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/任何内容。