问题: 我有许多包含Apache Web服务器日志条目的文件。这些条目不是按日期时间顺序排列,而是分散在文件中。我正在尝试使用Pig来读取一天的文件,按日期时间对日志条目进行分组和排序,然后将它们写入以其包含的条目的日期和小时命名的文件。
设置: 一旦我导入了我的文件,我使用Regex获取日期字段,然后我将其截断为小时。这将生成一个集合,该集合在一个字段中包含记录,而日期在另一个字段中截断为小时。从这里开始,我正在分组日期时间字段。
首次尝试: 我的第一个想法是在使用FOREACH迭代我的组时使用STORE命令,并且很快发现对Pig来说这并不酷。
第二次尝试: 我的第二次尝试是在piggybank中使用MultiStorage()方法,这种方法很有效,直到我查看文件。问题是MulitStorage想要将所有字段写入文件,包括我以前用于分组的字段。我真正想要的只是写入文件的原始记录。
问题: 那么......我是否将Pig用于不适合的事情,或者是否有更好的方法让我使用猪来解决这个问题?现在我有了这个问题,我将研究一个简单的代码示例来进一步解释我的问题。有了它,我会在这里发布。提前谢谢。
答案 0 :(得分:2)
开箱即用,Pig没有很多功能。它做了基本的东西,但更多的时候我发现自己必须编写自定义UDF或加载/存储函数来获得95%的方式到那里100%的方式。我通常觉得它值得,因为只需编写一个小型存储函数比整个MapReduce程序少得多。
你的第二次尝试非常接近我会做的事情。您应该复制/粘贴MultiStorage
的源代码或使用继承作为起点。然后,修改putNext
方法以去除组值,但仍写入该文件。很遗憾,Tuple
没有remove
或delete
方法,因此您必须重写整个元组。或者,如果您拥有的只是原始字符串,只需将其拉出并输出包含在Tuple
中的字符串。
有关编写加载/存储功能的一些常规文档,以备您需要更多帮助时使用:http://pig.apache.org/docs/r0.10.0/udf.html#load-store-functions