官方关于UDF的使用介绍:https://cwiki.apache.org/confluence/display/Hive/LanguageManual+UDF
UDF几个相关概念:
UDF: one-to-one row mapping : upper substr【进来一行出去一行】
UDAF: Aggregation Many-to-one row mapping 比如sum/min【进来多行出去一行】
UDTF: Table-generating one-to-many 比如:lateral view explode()【一对多】
编写UDF函数测试代码:
pod.xml添加hive:
<!--添加hive依赖--> <hive.version>1.1.0-cdh6.7.0</hive.version> <dependency> <groupId>org.apache.hive</groupId> <artifactId>hive-exec</artifactId> <version>${hive.version}</version> </dependency>
HelloUDF.java:
package com.ruozedata.hadoop.udf; import org.apache.hadoop.hive.ql.exec.UDF; public class HelloUDF extends UDF{ public String evaluate(String input) { //TODO...此处为开发业务逻辑的地方 return "Hello:" + input; } //下面为测试代码 public static void main(String[] args) { HelloUDF udf = new HelloUDF(); String output = udf.evaluate("测试数据"); System.out.println(output); } } 注:实现UDF函数的套路是一样的,第一步继承UDF函数,第二步重写evaluate方法
在idea中用maven打包后,上传到hive服务器;包名为:g6-hadoop-udf.jar
hive创建函数的几种方式:
方法一:创建临时函数(Temporary Functions)
官方参考:https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL#LanguageManualDDL-CreateFunction
缺点:Temporary Functions只对当前 session(窗口)有效
示例:在Hive的Shell中执行
ADD JAR /home/hadoop/lib/g6-hadoop-udf.jar;
CREATE TEMPORARY FUNCTION sayHello AS ‘com.ruozedata.hadoop.udf.HelloUDF’;
show functions;(执行此语句,可以看到sayHello在函数中)
select sayhello(‘abc’) from dual;(输出的结果为:Hello:abc)
注:此种方式还有一个缺点是,jar需要每次手动add才能识别class_name
方法二:无需手动add jar包
在hive的家目录下创建auxlib目录,把jar包放在此目录下即可;
不管创建临时函数,还是持久函数,把jar放入auxlib后就无需手动进行加载;
方法三:创建持久函数(Permanent Functions),并且使用hdfs上的jar;生产建议此种方式
从hive 0.13开始,支持将函数注册到metastore中,存放的表为FUNCS(里边默认为空);
将jar包放在hdfs的/lib目录下;
示例:在Hive的Shell中执行以下命令
CREATE FUNCTION sayhello2 AS 'com.ruozedata.hadoop.udf.HelloUDF' USING JAR 'hdfs://ruozeclusterg6/lib/g6-hadoop-udf.jar';
注:此时可以任何窗口使用sayhello2函数(使用show functions无法查到,但在元数据的FUNCS表中可以看到)
查看mysql中hive库的FUNCS表;发现sayhello2已成功进行注册;
原创文章,作者:kepupublish,如若转载,请注明出处:https://blog.ytso.com/194747.html