为什么需要自定义函数

hive的内置函数满足不了所有的业务需求。
hive提供很多的模块可以自定义功能,比如:自定义函数、serde、输入输出格式等

常见自定义函数UDF分三种:

  1. UDF(User Defined Function),一进一出(输入一行,输出一行),比如:upper(),lowser()等。
  2. UDFA(User Defined Aggregation Funcation),多进一出(输入多行,输出一行),比如avg()、sum()、max()、min()、count()等。
  3. UDTF(User Defined Table Generating Functions),一进多出(输入一行,输出多行),比如collect_set()、collect_list()等。

UDF格式

  • 继承org.apache.hadoop.hive.ql.exec.UDF;
  • 重写evaluate()方法;
  • 打包jar;
  • 添加jar包
  • 使用自定义函数

在新建的Maven工程的pom.xml,加入以下hive的依赖包,如下:

<dependency>
<groupId>org.apache.hive</groupId>
<artifactId>hive-exec</artifactId>
<version>1.2.2</version>
</dependency>

定义UDF函数要注意下面几点:

  • 继承org.apache.hadoop.hive.ql.exec.UDF
  • 重写evaluate(),这个方法不是有接口定义的,因为它可接受的参数的个数,数据类型都是不确定的。Hive会检查UDF,看能否找到和函数调用相配的evaluate()方法。
  1. 自定义函数第一个案例
import org.apache.commons.lang.StringUtils;
import org.apache.hadoop.hive.ql.exec.UDF;public class FirstUDF extends UDF {public String evaluate(String str){String upper=null;//1、检查输入参数if (StringUtils.isEmpty(str)){} else {// 转大写。upper = str.toUpperCase();}return upper;}
}

  1. 打包jar
  2. 添加jar包
    1. 把生成的jar包上传到服务器上的:/UDF.jar
    2. 命令加载
add jar /UDF.jar;
-- 创建一个临时函数名,要跟上面hive在同一个session里面:
create temporary function toUP as 'FirstUDF';
-- 查看
show functions;

show functions;
-- 测试
select toUP("abcdef");

select toUP(&amp;amp;amp;amp;quot;abcdef&amp;amp;amp;amp;quot;);
-- 删除函数
drop temporary function if exists toUP;

UDTF格式

  1. 继承org.apache.hadoop.hive.ql.udf.generic.GenericUDTF;
  2. 实现initialize()、process()、close()方法。
  3. UDTG首先会调用initialize()方法,此方法返回UDTF的返回行的信息(返回个数,类型)。
  4. 初始化完成后悔调用process()方法,对传入的参数进行处理,可以通过forward()方法把结果返回。
  5. 最后调用close()对需要清理的方法进行清理。
  6. 案例:使用UDTF对"Key:Value"这种字符串进行切分,返回结果为key,Value两个字段。
import org.apache.hadoop.hive.ql.exec.UDFArgumentException;
import org.apache.hadoop.hive.ql.metadata.HiveException;
import org.apache.hadoop.hive.ql.udf.generic.GenericUDTF;
import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector;
import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspectorFactory;
import org.apache.hadoop.hive.serde2.objectinspector.StructObjectInspector;
import org.apache.hadoop.hive.serde2.objectinspector.primitive.PrimitiveObjectInspectorFactory;import java.util.ArrayList;
import java.util.List;public class ParseMapUDTF extends GenericUDTF {//在initializez中初始化要输出字段的名称和类型@Overridepublic StructObjectInspector initialize(ObjectInspector[] argOIs) throws UDFArgumentException {//定义要输出列的名字的List,并且添加要输出的列名List<String> structFieldNames = new ArrayList<>();structFieldNames.add("key");structFieldNames.add("value");
//      定义要输出列的类型的List,并且添加要输出列的类型List<ObjectInspector> objectInspectorList = new ArrayList<>();objectInspectorList.add(PrimitiveObjectInspectorFactory.javaStringObjectInspector);objectInspectorList.add(PrimitiveObjectInspectorFactory.javaStringObjectInspector);return ObjectInspectorFactory.getStandardStructObjectInspector(structFieldNames, objectInspectorList); }@Overridepublic void process(Object[] args) throws HiveException {String strings=args[0].toString();String[] split=strings.split(";");for (String s : split) {String [] kvArray=s.split(":");forward(kvArray);}}@Overridepublic void close() throws HiveException {}
}

  1. 打包jar
  2. 添加jar包
-- UDTF格式
add jar /hive_init/UDTF.jar;
-- 创建一个临时函数parseMap
create temporary function parseMap as 'ParseMapUDTF';
show functions ;

show functions ;
-- 测试函数
select parseMap("name:zhang;age:30;address:shenzhen");

select parseMap(&amp;amp;amp;amp;quot;name:zhang;age:30;address:shenzhen&amp;amp;amp;amp;quot;);
  1. UDAF格式

hive的udaf是自定义聚合函数配合group by使用,接受0行到多行数据返回一个计算结果值,定义今天内部表类,实现UDAFEvaluator的

  • init()初始化一般肤质初始化内部字段,通常初始化用来存放最终结果的变量。
  • iterate()每次都会对一个新的值进行聚合计算时时都调用该方法,一般会根据计算结果更新用来存放最终结果的变量,如果计算正确或者输入值合法就返回true;
  • terminatePartial()这个方法直译过来就是“终止部分”,部分聚合结果的时候调用该方法必须返回一封装了聚合计算当前状态的对象,类似于MapReduce的combiner
  • merge()接受来自terminatePartial的返回结果,进行合并,hive合并两部分聚合的时候回调用这个方法。
  • terminate()终止方法返回最终函数结果。
  1. 案例:使用UDAF对数据进行
package week12.day01;import org.apache.hadoop.hive.ql.exec.Description;
import org.apache.hadoop.hive.ql.exec.UDAF;
import org.apache.hadoop.hive.ql.exec.UDAFEvaluator;
import org.apache.hadoop.hive.serde2.io.DoubleWritable;/*** description: SumValueUDAF* 定义一个UDAF自定义函数,默认要继承与UDAF类*/
@Description(name = "SumValue",value = "Sue For Peace ",extended = "Extension: Find The Sum of col")
public class SumValueUDAF extends UDAF {public static class SumnumDoubleUDAFEvaluator implements UDAFEvaluator {//    在静态列内部定义一个返回值,作为当前UDAF最后的唯一返回值,因为返回值要hive调用,所以必须要使用序列化类型private DoubleWritable result;/*** 初始化是把返回值设为null,避免上传调用时混淆*/@Overridepublic void init() {result = null;}/*** 定义一个函数iterate用来处理遍历多行时,每行值传进来是调用的函数** @param value* @return*/public boolean iterate(DoubleWritable value) {if (value == null) {return true;}if (result == null) {result=new DoubleWritable(value.get());} else {result.set(result.get() + value.get());}return true;}/*** 在map端进行执行后的结果** @return*/public DoubleWritable terminatePartial() {return result;}/*** 接收terminatePartial的返回结果,进行数据merge操作,其返回类型为boolean** @param other* @return*/public boolean merge(DoubleWritable other) {return iterate(other);}/*** 将最终的几个返给hive* @return*/public DoubleWritable terminate() {return result;}}}

  1. 打包jar
  2. 添加jar包
add jar /week12.jar;
-- 删除jar包
delete jar /week12.jar;-- 删除内置函数sum_UDAF
create temporary function sum_UDAF as 'week12.day01.SumValueUDAF';
drop temporary function if exists sum_UDAF;
-- 查看添加的函数sum_UDAF
desc function sum_UDAF;select sum_UDAF(cost) --661
from day05.t_order;

hive udaf_Hive自定义函数相关推荐

  1. Hadoop生态圈-hive编写自定义函数

    Hadoop生态圈-hive编写自定义函数 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.

  2. Hadoop生态圈-Hive的自定义函数之UDF(User-Defined-Function)

    Hadoop生态圈-Hive的自定义函数之UDF(User-Defined-Function) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 转载于:https://www.cnb ...

  3. hive udaf_Hive UDAF 函数的编写

    UDAF是Hive中用户自定义的聚集函数,Hive内置UDAF函数包括有sum()与count(),UDAF实现有简单与通用两种方式,简单UDAF因为使用Java反射导致性能损失,而且有些特性不能使用 ...

  4. Hive UDF自定义函数(临时和永久的区别)

    Hive中虽然自带了一些函数,例如max().avg().sum()等,但有时候这些函数可能无法满足我们的需要,这时候就可以通过自定义UDF来进行扩展. 开发流程 UDF的开发流程基本有以下步骤: 继 ...

  5. Hive之自定义函数

    1.系统内置函数 (1)查看系统自带的函数  show functions; (2)显示自带的函数的用法  desc function upper; (3)详细显示自带的函数的用法  desc fun ...

  6. hive的自定义函数以及自定义加密函数

    hive对于敏感数据的加密还不够完善,现在开发一个udf函数,自己设置密钥(hive的加密函数等级比较低,也没有集成自己加密的密钥函数,所以自己开发一个),如果要加密一些数据则可以自己使用特定的密钥进 ...

  7. hive 元数据 自定义_如何在Hive中创建自定义函数UDF及如何直接通过Impala的同步元数据重用UDF的jar文件-阿里云开发者社区...

    如何在Hive中创建自定义函数UDF及使用 如何在Impala中使用Hive的自定义函数 UDF函数开发 使用Intellij工具开发Hive的UDF函数,进行编译: 1.使用Intellij工具通过 ...

  8. Hive 自定义函数UDF入门

    1.为什么要用自定义函数 1.1 hive的内置函数满足不了的业务需求,这时候就需要使用自定义函数 1.2 hive的自定义函数有那些 1.UDF  一对一输出输入(本章使用) 2.UDTF 一对多输 ...

  9. 2021年大数据Hive(八):Hive自定义函数

    全网最详细的Hive文章系列,强烈建议收藏加关注! 后面更新文章都会列出历史文章目录,帮助大家回顾知识重点. 目录 系列历史文章 前言 Hive自定义函数 一.概述 1.UDF(User-Define ...

最新文章

  1. Jenkins配置Java项目1(Java+Maven+Tomcat+SVN/Git)
  2. java raster_Raster
  3. 操作系统原理: 操作系统概述
  4. 2款在线FM音乐聚合播放PHP源码 带搜索
  5. Spring Boot+Maven将配置文件打包到Jar包外方便运维修改配置
  6. zlib源码导读[转]
  7. 深入浅出OOP(一): 多态和继承(早期绑定/编译时多态)
  8. mpfr-3.1.0编译方法
  9. 计算机基础(三):srpintf()函数小结
  10. Scala学习教程笔记三之函数式编程、集合操作、模式匹配、类型参数、隐式转换、Actor、...
  11. PMP学习资料干货分享 - 干货满满
  12. css3仿手机版淘宝商品并列显示
  13. 计算机网络技术超星尔雅章节检测,超星尔雅计算机网络技术第二章节测验答案...
  14. python info函数的使用方法_Python 函数
  15. QPainter绘制方法
  16. 电商公司ERP管理软件与旺店通、第三方仓库以及云仓的贯通解决方案
  17. 网络电视精灵 完整版
  18. vc++加载透明png图片方法——GDI+和CImage两种
  19. 招投标概念及注意事项
  20. 自媒体平台今日头条申请秘籍(转)

热门文章

  1. 使用控制结构——循环语句——基本循环
  2. 在ASP.NET中使用Session常见问题集锦
  3. EDEN-MACE 1.4.0 更新,增加数据清理功能
  4. linux 的那些hung 检测机制
  5. VS2012+WDK7600.16385.1 驱动环境配置(模板导出)
  6. eclipse 开发环境配置
  7. free -m 释放缓冲失败
  8. kubernetes k8s一文入门
  9. Redis面试常问2-- 从海量数据里查询某一固定前缀的key? SCAN cursor
  10. Java企业面试算法新得体会之3二叉树问题24问