问题:我有许多包含 Apache Web 服务器日志条目的文件。这些条目不按日期时间顺序排列,并且分散在文件中。我正在尝试使用 Pig 读取一天的文件,按日期时间对日志条目进行分组和排序,然后将它们写入以其包含的条目的日期和小时命名的文件中。
Setup:导入文件后,我使用正则表达式获取日期字段,然后将其截断为小时。这会生成一个集合,其中一个字段中包含记录,而另一个字段中的日期被截断为小时。从这里我将在日期时间字段上进行分组。
第一次尝试:我的第一个想法是使用 STORE 命令,同时使用 FOREACH 迭代我的组,很快发现这对 Pig 来说并不酷。
第二次尝试:我的第二次尝试是使用 Piggybank 中的 MultiStorage() 方法,在我查看该文件之前,该方法效果很好。问题是 MulitStorage 想要将所有字段写入文件,包括我用来分组的字段。我真正想要的只是写入文件的原始记录。
问题:那么...我是否使用 Pig 来做一些不该做的事情,或者有没有更好的方法让我使用 Pig 来解决这个问题?现在我有了这个问题,我将编写一个简单的代码示例来进一步解释我的问题。一旦我有了它,我就会把它发布在这里。提前致谢。
开箱即用,Pig 没有很多功能性。它完成基本的工作,但很多时候我发现自己必须编写自定义 UDF 或加载/存储函数才能从 95% 的方式达到 100% 的方式。我通常觉得这是值得的,因为仅仅编写一个小的存储函数比编写一个整个 MapReduce 程序要少很多 Java。
你的第二次尝试非常接近我会做的。您应该复制/粘贴源代码MultiStorage
或者使用继承作为起点。然后,修改putNext
方法删除组值,但仍写入该文件。很遗憾,Tuple http://pig.apache.org/docs/r0.10.0/api/org/apache/pig/data/Tuple.html没有remove
or delete
方法,因此您必须重写整个元组。或者,如果您只有原始字符串,只需将其拉出并输出包裹在Tuple
.
一些有关编写加载/存储函数的一般文档,以防您需要更多帮助:http://pig.apache.org/docs/r0.10.0/udf.html#load-store-functions http://pig.apache.org/docs/r0.10.0/udf.html#load-store-functions
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)