介绍
Apache DataFu分两部分,本文介绍的是其Pig UDF的部分。代码在Github上开源(除了代码外,也有一些slides介绍链接)。
DataFu里面是一些Pig的UDF,主要包括这些方面的函数:
bags、geo、hash、linkanalysis、random、sampling、sessions、sets、stats、urls
每方面都对应一个package。
我把所有的函数源码都浏览了一遍。其实本身对这些UDF的使用,官方的文档上都有介绍,而且源码的注释里也些的很清晰。所以使用本身是很简单的。
从实现角度看,继承自Pig EvalFunc体系。我们知道Pig里的builtin functions里,有代数函数(AVG、COUNT、Distinct、TOP),代数数学函数(MAX、SUM),基本数学函数(SIN、COS、TAN、FLOOR、LOG)等等。
DataFu实现了一个SimpleEvalFunc抽象类,继承自EvalFunc,包装了EvalFunc,为简单的UDF简化了实现过程(省略了一些异常检查情况,只需注重处理逻辑)。
通过反射的方式,在exec()方法里做好参数null检查,个数检查,最后把参数传给子类实现的call()方法,返回结果。
SimpleEvalFunc的子类继承体系如下:
下面那各个Package包含的函数功能简单概况一下。
bags
对Bag的基本操作,涉及append、concat、group、left-join、split、count等等
geo
经纬度距离计算
hash
对输入的String进行MD5和SHA的转换
linkanalysis
一个PageRank的实现
random
只有一个RandInt,输入两个值,输出两值之间的一个random值
sampling
SimpleRandomSample和ReservoirSample,后者的Reservoir是一个PriorityQueue,存的是ScoredTuple。前后者区别在于*和有界的sample结果。
sessions
按一段time window来group
sets
Set之间的差、交、并。
处理的bag内的tuples必须是有序的。
stats
统计相关方法:
计算Quantile的两种方式,一种是流式的。Quantile包含了Median。
方差。
urls
用于区分user agent来源(电脑还是手机,什么系统的手机)