HiveHive函数(UDF和reflect)
文章目录
- 内置函数
- Hive自定义函数
- UDF开发实例
- UDF编写自己的业务代码(方式一)
- Hive通过reflect调用Java方法(方式二)
内置函数
内容较多,见《Hive官方文档》
+UDF
1)查看系统自带的函数
#hive> show functions;
hive> show functions 函数名;2)显示自带的函数的用法
hive> desc function upper;3)详细显示自带的函数的用法
hive> desc function extended upper;
Hive自定义函数
- 1)Hive 自带了一些函数,比如:max/min等,但是数量有限,自己可以通过自定义UDF来方便的扩展。
- 2)当Hive提供的内置函数无法满足你的业务处理需要时,此时就可以考虑使用用户自定义函数(UDF:user-defined function)。
- 3)根据用户自定义函数类别分为以下三种:
(1)UDF(User-Defined-Function)
一进一出
(2)UDAF(User-Defined Aggregation Function)
聚集函数,多进一出
类似于:count/max/min
(3)UDTF(User-Defined Table-Generating Functions)
一进多出
如lateral view explore() - 4)官方文档地址
- 5)编程步骤:
(1)继承org.apache.hadoop.hive.ql.UDF
(2)需要实现evaluate函数;evaluate函数支持重载; - 6)注意事项
(1)UDF必须要有返回类型,可以返回null,但是返回类型不能为void;
(2)UDF中常用Text/LongWritable等类型,不推荐使用java类型;
UDF开发实例
- 第一步:创建maven java 工程,导入jar包
<repositories><repository><id>cloudera</id><url>/</url></repository>
</repositories>
<dependencies><dependency><groupId>org.apache.hadoop</groupId><artifactId>hadoop-common</artifactId><version>2.6.0-cdh5.14.0</version></dependency><dependency><groupId>org.apache.hive</groupId><artifactId>hive-exec</artifactId><version>1.1.0-cdh5.14.0</version></dependency>
</dependencies>
<build>
<plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.0</version><configuration><source>1.8</source><target>1.8</target><encoding>UTF-8</encoding></configuration></plugin><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-shade-plugin</artifactId><version>2.2</version><executions><execution><phase>package</phase><goals><goal>shade</goal></goals><configuration><filters><filter><artifact>*:*</artifact><excludes><exclude>META-INF/*.SF</exclude><exclude>META-INF/*.DSA</exclude><exclude>META-INF/*/RSA</exclude></excludes></filter></filters></configuration></execution></executions></plugin>
</plugins>
</build>
- 第二步:开发java类继承UDF,并重载evaluate 方法
小写转大写
public class ItcastUDF extends UDF {public Text evaluate(final Text s) {//判空if (null == s) {return null;}//返回大写字母return new Text(s.toString().toUpperCase());}
}
- 第三步:将我们的项目打包,并上传到hive的lib目录下
- 第四步:添加我们的jar包
cd /export/install/hive-1.1.0-cdh5.14.0/lib
mv original-day_06_hive_udf-1.0-SNAPSHOT.jar udf.jar
hive的客户端添加我们的jar包
add jar /export/install/hive-1.1.0-cdh5.14.0/lib/udf.jar;
- 第五步:设置函数与我们的自定义函数关联
创建临时函数
create temporary function tolowercase as 'cn.itcast.udf.ItcastUDF';
查看函数
show functions;show function 函数名 ;
删除临时函数
drop temporary function tolowercase
创建永久函数
create function tolowercase1 as 'cn.itcast.udf.ItcastUDF';
删除永久函数
drop function tolowercase1;
- 第六步:使用自定义函数
select tolowercase('abc');
UDF编写自己的业务代码(方式一)
- 第一步:UDF编写业务逻辑代码(勿忘 清除+打包jar)
- 第二步:传jar包
- 第三步:添加jar包到hive
总结 - 1、创建一个class 继承UDF
- 2 编写evaluate函数,在这里编写业务需求需要的代码
- 3 打成jar包,并上传
- 4 将jar包添加到hive
在hive shell 内 add jar 路径+jar包 - 5 创建临时函数(永久的函数将temporary 删掉)
create temporary function 新的函数的名称 as 业务代码所在的包名-类名; - 6 调用 验证;
Hive通过reflect调用Java方法(方式二)
- 第一步创建普通类并编辑业务逻辑代码
- 第二步上传jar包
- 第三步:添加jar包到hive(reflect无需创建函数,直接查询计算)
总结 - 1、使用纯java代码编写业务逻辑,并打包上传
- 2、将jar包添加到hive
在hive shell 内 add jar 路径+jar包 - 3、调用参数(reflect无需创建函数,查询直接计算)
select reflect (‘参数一’,‘参数二’,‘参数三’)
参数一 :包名-类名
参数二:方法名
参数三 :需要计算的数据
发布评论