Hive的UDF是什么?
首先我们学习hadoop的时候,为了让我们不太会java语言但是对SQL很熟悉的工程师能够操作基本的mapreduce计算过程,Hive被设计出来了。Hive就好比是hadoop在执行MR(mapreduce)程序的一个操作系统,因为我们可以用简单的SQL语句去代替复杂的MR程序,因为Hive可以将我们的SQL语句转化为MR程序然后去执行。Hive的语法和SQL的语法很多地方是相同的,所以说它就是为熟连使用SQL的工程师设计的。
首先什么是UDF,UDF的全称为user-defined function,用户定义函数,为什么有它的存在呢?有的时候 你要写的查询无法轻松地使用Hive提供的内置函数来表示,通过写UDF,Hive就可以方便地插入用户写的处理代码并在查询中使用它们,相当于在HQL(Hive SQL)中自定义一些函数。
首先UDF必须用java语言编写,Hive本身就是用java写的。所以想学好hadoop这个分布式框架的相关技术,熟练使用java就是基本功了!
Hive中有三种UDF:(普通)UDF、用户定义聚集函数(user-defined aggregate function,UDAF)、用户定义表生成函数(user-defined table-generating function,UDTF)。
UDF操作作用于单个数据行,并且产生一个数据行作为输出。大多数函数都属于这一类(比如数学函数和字符串函数)。
UDAF 接受多个输入数据行,并产生一个输出数据行。想COUNT和MAX这样的函数就是聚集函数。
UDTF 操作作用于单个数据行,并且产生多个数据行-------一个表作为输出
首先一个UDF必须满足下面两个条件:
1 一个UDF必须是org.apache.hadoop.hive.ql.exec.UDF的子类(换句话说就是我们一般都是去继承这个类)
2 一个UDF必须至少实现了evaluate()方法
注意UDF名不是大小写敏感的
一个UDAF计算函数必须实现下面的5个方法:
1 init()方法 init()方法负责初始化计算函数并重设它的内部状态。在MaximumIntUDAFEvaluator中,我们把存放最终结果的IntWritable对象设置为null。我们使用null来表示目前还没有对任何值进行聚集计算,这和对空集NULL计算最大值应有的结果是一致的。
2 iterate()方法 每次对一个新值进行聚集计算时都会调用iterate()方法。计算函数要根据聚集计算的结果更新其内部状态。iterate()接受的参数和Hive中被调用函数的参数使对应的。
3 terminatePartial()方法 Hive需要部分聚集结果时会调用terminatePartial()方法。这个方法必须返回一个封装了聚集计算当前状态的对象。
4 merge()方法 在Hive决定要合并一个部分聚集值和另一个部分聚集值时会调用merge()方法。该方法接受一个对象作为输入。这个对象的类型必须和terminatePartial()方法返回的类型一致。
5 terminate() Hive需要最终聚集结果时会调用terminate()方法。计算函数需要把状态作为一个值返回。
具体去写UDF的过程我这里就不具体说了,我来说说,怎样去把我们写好的UDF放到Hive中去使用:
首先我们将用java写好的UDF函数编译后的Java类打包成为一个JAR文件,并在Hive中注册这个文件(相当于告诉Hive这个是我写的UDF):
ADD JAR /path/hive-sample.jar;
- 给我们写的UDF中的Strip类起个别名
- CREATE TEMPORARY FUNCTION strip AS 'com.hadoop.hive.Strip';
经过了上面这个过程就可以在Hive中使用这个UDF了
比如 SELECT strip(‘bee‘) FROM dummy;