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 (‘参数一’,‘参数二’,‘参数三’)
    参数一 :包名-类名
    参数二:方法名
    参数三 :需要计算的数据