当前位置:   article > 正文

Hive 自定义UDF函数讲解_编写一个自定义的hive udf总结

编写一个自定义的hive udf总结

目录

一、UDF描述

二、UDF种类

三、自定义实现UDF和UDTF

3.1 需求

3.2 项目pom文件

3.3 Hive建表测试及数据

3.4UDF函数编写

3.5 UDTF函数编写

四:添加到hive


一、UDF描述

UDF全称为 User-Defined Functions, 即用户自定义函数,在Hive SQL编译成MapReduce任何时,执行java方法,类似于像MapReduce执行过程中加入一个插件,方便拓展。

二、UDF种类

UDF: 操作单个数据行,产生单个数据行;

UDAF: 执行多个数据行,产生一个数据行;

UDTF: 执行一个数据行,产生多个数据行一个表作为输出;

三、自定义实现UDF和UDTF

3.1 需求

1)UDF,自定义一个函数,并且实现把列中的数据由大写转换成小写

2) UDTF,拆分一个表中name字段以/为分割,分成不同的列,如下所示:

表中数据:

  1. 1 id name
  2. 2
  3. 3 1 Lq/Sg
  4. 4 2 Hh

要拆分成如下格式:

  1. 1 id name
  2. 2
  3. 3 1 Lq
  4. 4 1 Sg
  5. 5 2 Hh

3.2 项目pom文件

  1. 1 <dependency>
  2. 2 <groupId>org.apache.hive</groupId>
  3. 3 <artifactId>hive-jdbc</artifactId>
  4. 4 <version>2.3.0</version>
  5. 5 </dependency>

3.3 Hive建表测试及数据

  1. 1 create table if not exists user(
  2. 2 id String ,
  3. 3 name String
  4. 4 );

向Hive表中插入数据:

  1. 1 insert into user(id,name) values ('1','Lq|Sg');
  2. 2 insert into user(id,name) values ('2','Hh');

3.4UDF函数编写

UDF函数需要继承org.apache.hadoop.hive.ql.exec.UDF类,并且添加evaluate方法,原因是:UDF类默认的UDFMethodResolver是org.apache.hadoop.hive.ql.exec.DefaultUDFMethodResolv​​​​​er,evaluate方法是在DefaultUDFMethodResolver中进行配置,默认绑定的是evaluate方法。

添加evaluate有两个注意事项:

1)evaluate方法遵循重载的原则,参数是用户自定义的,调用那个方法调用是在使用函数时候的参数决定。

 2)evaluate方法必须有返回值,返回类型以及方法参数可以是Java数据或相应的Writable类。

具体实现:

  1. public class MyUDF extends UDF {
  2. public String evaluate(String s){
  3. if(s == null){
  4. return "";
  5. }
  6. return s.toLowerCase();
  7. }
  8. }

3.5 UDTF函数编写

实现:

  1. import org.apache.hadoop.hive.ql.exec.UDFArgumentException;
  2. import org.apache.hadoop.hive.ql.metadata.HiveException;
  3. import org.apache.hadoop.hive.ql.udf.generic.GenericUDTF;
  4. import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector;
  5. import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspectorFactory;
  6. import org.apache.hadoop.hive.serde2.objectinspector.StructObjectInspector;
  7. import org.apache.hadoop.hive.serde2.objectinspector.primitive.PrimitiveObjectInspectorFactory;
  8. import java.util.ArrayList;
  9. import java.util.List;
  10. public class MyUDTF extends GenericUDTF {
  11. @Override
  12. public StructObjectInspector initialize(StructObjectInspector argOIs) throws UDFArgumentException {
  13. ArrayList<String> fieldNames = new ArrayList<>();
  14. ArrayList<ObjectInspector> fieldTypes = new ArrayList<>();
  15. fieldNames.add("col");
  16. fieldTypes.add(PrimitiveObjectInspectorFactory.javaStringObjectInspector);
  17. return ObjectInspectorFactory.getStandardStructObjectInspector(fieldNames,fieldTypes);
  18. }
  19. @Override
  20. public void process(Object[] args) throws HiveException {
  21. String col = args[0].toString();
  22. String[] cols = col.split("\\/");
  23. for (String c : cols) {
  24. String[] results = new String[1];
  25. results[0] = c;
  26. forward(results);
  27. }
  28. }
  29. @Override
  30. public void close() throws HiveException {
  31. }
  32. }

四:添加到hive

上传到Linux目录,然后用add jar来添加路径

  1. -- 导入自定义的jar包
  2. add jar /root/jars/original-test_hive-1.0-SNAPSHOT.jar;

创建临时函数

  1. -- 创建临时函数
  2. create temporary function change_UDF as 'MyUDF';
  3. create temporary function sli_UDTF as 'MyUDTF';

创建永久函数

  1. -- 创建永久函数
  2. create function change_UDF as 'MyUDF';
  3. create function sli_UDTF as 'MyUDTF';

应用函数

  1. -- 通过函数 把字段数据转换成小写
  2. select change_UDF(name) as Lo_name from user;
  3. -- 通过函数把字段数据进行切分
  4. select sli_UDTF(name) as sli_name from user;
  5. -- 通过函数把数据拆分 然后把字段数据进行转换
  6. select change_UDF(u.name) from (select sli_UDTF(name) as name from user) u ;

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/黑客灵魂/article/detail/933690
推荐阅读
相关标签
  

闽ICP备14008679号