hive 的udf(user defined function)自定义函数
1.新建java maven 项目
2.pom.xml 中引入
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-common</artifactId>
<version>2.7.4</version>
</dependency>
<dependency>
<groupId>org.apache.hive</groupId>
<artifactId>hive-exec</artifactId>
<version>1.2.1</version>
</dependency>
3.写一个 java 类,继承 UDF,并重载 evaluate 方法【注意:udf类中并没有evaluate()方法,hive的内部机制会自动调用 evaluate()方法;同时自己创建的java类中可以定义多个evaluate()方法 如: public Text evaluate(Text s) {} public String evaluate(int end){}】【重写的evaluate()方法必须有返回值 不能用void修饰】
4.需求:定义一个自定义函数 将大写转换成小写 代码如下:
package cn.hive;
import org.apache.hadoop.hive.ql.exec.UDF;
import org.apache.hadoop.io.Text;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Lower extends UDF {
public Text evaluate(Text s) {
if (s == null) {
return null;
}
return new Text(s.toString().toLowerCase());
}
5.将项目打包 打包后 放到linux系统hive的默认目录【不需要上传到hdfs】【默认目录:/opt/molute/jars/ (没有的话自己创建目录)
6.将jar包 添加到hive的classpath 【进入hive命令】【此步骤也相当于在hive上注册jar包】
hive> add jar /opt/molute/jars/udf.jar;
若执行成功 显示如下:
hive> add jar /opt/module/jars/udf.jar;
Added [/opt/module/jars/udf.jar] to class path
Added resources: [/opt/module/jars/udf.jar]
7.创建临时函数与开发好的 java class 关联
create temporary function toLowerCase as ‘cn.hive.Lower’; [【’’ 里是java类的路径 toLoweCase 是起的函数名 temporary是临时的】
8.测试 :show functions; 看我们刚才创建的hive 的自定义函数 toLowerCase 有没有
有的话 ,我们使用toLoweCase() 函数查询我们的一张表peopeo数据试试 如:
select toLoweCase(name) from peopeo; 结果成功 。ok 结束。
9.再举个例子:需求: 输入一个数字,输出从1到该数字的一个列表
代码:
自我理解udf自定义函数:1.可以使用java中现有的方法 ,在evaluate(参数)方法中调用,并返回我们想要的数据即可。2.或者我们在java中自定义一个方法 写自己的业务实现功能,然后定义evaluate()方法时 传递适合的参数 调用我们自定义的方法 并evaluate 返回我们需要的数据 也行。
3.最终理解:就是hive内部机制会自动调用evaluate方法【只要注重 参数 和返回值即可 hive中自定义的方法名 随便起 默认执行evaluate方法中的业务逻辑并返回结果 evaluate方法返回的结果就是我们自定义函数想要的结果 所以 evaluate方法不能用void修饰】
小总:打好的包 不需要上传到hdfs上,有默认的路径 :/opt/molute/jars/ 【没有自己手动创建即可】上面创建的只是临时自定义函数 【对于每一行输入都会调用到evaluate()函数。而evaluate()函数处理后的值会返回给Hive。】,如果想创建永久自定义函数 我们需要
在 hive-site.xml 文件中添加
hive.aux.jars.path
file:///opt/module/hive/lib/json-serde-1.3.8-jar-with-dependencies.jar,file:///opt/module/jar/udf.jar
这里相当于添加了多个jar
永久注册
hive (default)>create function getdaybegin AS ‘com.lzl.hive.Lower’;
删除函数
hive (default)>drop function getdaybegin;
链接:https://blog.youkuaiyun.com/liangzelei/article/details/81206012