2

问题: 我有许多包含 Apache Web 服务器日志条目的文件。这些条目不是按日期时间顺序排列的,而是分散在文件中的。我正在尝试使用 Pig 读取一天的文件,按日期时间对日志条目进行分组和排序,然后将它们写入以它包含的条目的日期和小时命名的文件。

设置: 导入文件后,我使用正则表达式获取日期字段,然后将其截断为小时。这会产生一个集合,该集合在一个字段中具有记录,而在另一个字段中将日期截断为小时。从这里我在日期-小时字段上进行分组。

第一次尝试: 我的第一个想法是在使用 FOREACH 遍历我的组时使用 STORE 命令,并很快发现使用 Pig 并不酷。

第二次尝试: 我的第二次尝试是在存钱罐中使用 MultiStorage() 方法,在我查看文件之前效果很好。问题是 MulitStorage 想要将所有字段写入文件,包括我用来分组的字段。我真正想要的只是写入文件的原始记录。

问题: 那么......我是否将 Pig 用于它不打算用于的东西,或者有没有更好的方法让我使用 Pig 来解决这个问题?既然我有这个问题,我将处理一个简单的代码示例来进一步解释我的问题。一旦我有了它,我会在这里发布。提前致谢。

4

1 回答 1

2

开箱即用,Pig 没有很多功能。它完成了基本的工作,但更多时候我发现自己必须编写自定义 UDF 或加载/存储函数才能从 95% 的路径到 100% 的路径。我通常觉得这是值得的,因为仅仅编写一个小型存储函数比整个 MapReduce 程序要少很多 Java。

你的第二次尝试真的很接近我会做的事情。您应该复制/粘贴源代码MultiStorage或使用继承作为起点。然后,修改putNext方法以去除组值,但仍写入该文件。不幸的是,Tuple没有removeordelete方法,因此您必须重写整个元组。或者,如果您只有原始字符串,只需将其拉出并输出包裹在Tuple.

一些关于编写加载/存储函数的一般文档,以防您需要更多帮助: http: //pig.apache.org/docs/r0.10.0/udf.html#load-store-functions

于 2012-05-01T01:15:24.647 回答