Hive 函数高级编程

本文介绍了Hive中的自定义函数开发,包括UDF(User-Defined-Function)和UDAF(User-DefinedAggregationFuncation)。详细阐述了它们的开发步骤、使用方法及示例代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

虽然Hive提供了很多函数,但是有些还是难以满足我们的需求,因此Hive提供了自定义函数开发,经常用到的主要有两种类型:UDF(User-Defined-Function)和UDAF(User- Defined Aggregation Funcation),前者主要用来实现一进一出的操作,而后者就是实现多进一出的操作。

(1)UDF实现

•UDF(User-Defined-Function),UDF函数可以直接应用于select语句,对查询结构做格式化处理后,再输出内容

•编写UDF函数的时候需要注意一下几点:
1)自定义UDF需要继承org.apache.hadoop.hive.ql.UDF
2)需要实现evaluate函数
3)evaluate函数支持重载
4)hive中的array数据类型对应于java中的List类型,强大的功能

package com.hive.udf.running
import org.apache.Hadoop.hive.ql.exec.UDF   
   public  class Helloworld extends UDF{   
      public String evaluate(){   
           return "hello world!";   
     }   

      public String evaluate(String str){   
           return "hello world: " + str;   
     }   
}

开发步骤

  1. 开发代码 ,进入hive客户端
  2. 添加jar包:hive>add jar /包路径/包名称.jar;
  3. 创建临时函数:hive>CREATE TEMPORARY FUNCTION 函数名称(如,MyHello) AS ‘com.hive.udf.running.Helloworld’
  4. 查询HQL语句: •SELECT MyHello ( ‘ This is me!’) FROM scores;
  5. 销毁临时函数:hive> DROP TEMPORARY FUNCTION MyHello;

•在使用UDF的时候,会自动进行类型转换,例如其他:
SELECT my_add (8,9.1) FROM scores;
•结果是17.1,UDF将类型为Int的参数转化成double。类型的饮食转换是通过UDFResolver来进行控制的

(2)UDAF

UDAF(User- Defined Aggregation Funcation) ,Hive查询数据时,有些聚类函数在HQL没有自带,需要用户自定义实现,用户自定义聚合函数: Sum, Average…… 其中, 两个类是UDAF和UDAFEvaluator 必须的

开发步骤
•函数类需要继承UDAF类,内部类Evaluator实UDAFEvaluator接口
•Evaluator需要实现 init、iterate、terminatePartial、merge、terminate这几个函数
1)init函数实现接口UDAFEvaluator的init函数。
2)iterate接收传入的参数,并进行内部的轮转。其返回类型为boolean。
3)terminatePartial无参数,其为iterate函数轮转结束后,返回轮转数据,terminatePartial类似于hadoop的Combiner。
4)merge接收terminatePartial的返回结果,进行数据merge操作,其返回类型为boolean。
5)terminate返回最终的聚集函数结果。

代码实例:

package com.hive.udf;

import org.apache.hadoop.hive.ql.exec.UDAF;
import org.apache.hadoop.hive.ql.exec.UDAFEvaluator;

public class Avg extends UDAF {
    public static class AvgState {
        public long mCount;
        public double mSum;
    }

public static class AvgEvaluator implements UDAFEvaluator {
         AvgState state;
         public AvgEvaluator() {
                   super();
                   state = new AvgState();
                   init();
}
/** * init函数类似于构造函数,用于UDAF的初始化 */
public void init() {
         state.mSum = 0;
         state.mCount = 0;
}
/** * iterate接收传入的参数,并进行内部的轮转。其返回类型为boolean * * @param o * @return */
public boolean iterate(Double o) {
         if (o != null) {
                   state.mSum += o;
                   state.mCount++;
         } return true;
}
/** * terminatePartial无参数,其为iterate函数轮转结束后,返回轮转数据, * terminatePartial类似于hadoop的Combiner * * @return */
public AvgState terminatePartial() {
         // combiner
         return state.mCount == 0 ? null : state;
}
/** * merge接收terminatePartial的返回结果,进行数据merge操作,其返回类型为boolean * * @param o * @return */
public boolean merge(AvgState o) {                
         if (o != null) {
                   state.mCount +=o.mCount;
                   state.mSum += o.mSum;
         }
         return true;
}
/** * terminate返回最终的聚集函数结果 * * @return */
public Double terminate() {
         return state.mCount == 0 ? null : Double.valueOf(state.mSum / state.mCount);
}
}

}

执行步骤
•执行求平均数函数的步骤
1)将java文件编译成Hello.jar。
2)进入hive客户端添加jar包:
hive>add jar /包路径/Hello.jar。
3)创建临时函数:
hive>create temporary function MyAvg as ‘com.hive.udf.avg’;
4)查询语句:
hive>select MyAvg(scores) from scores;
5)销毁临时函数:
hive>drop temporary function MyAvg;

附加学习:
hive中新加字段需要注意如下
1)如果表中有分区字段,必须先删除分区才能插入数据否则为null;
2)insert override TABLE table1 select counm1,counm2 from table2; counm1,counm2的顺序必须与table1中字段的顺序一致否则为插入的值不对;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值