hive自定义函数

一.hive自定义函数介绍

当hive提供的内置函数无法满足业务需求时,可以考虑使用用户自定义函数(User-Defined Function,UDF)
hive中常见的UDF有如下3种

  • 1)UDF
  • 一条记录使用函数后输出还是一条记录,如:upper/substr
  • 2)UDAS(User-Defined Aggregation Function)
  • 多条记录使用函数后输出还是一条记录,如:count/max等
  • 3)UDTF(User-Defined Table-Generating Functions)
  • 一条记录使用函数后输出多条记录,如:lateral view explore()

二.hive自定义函数开发

1.需求:开发自定义函数,使得在指定字段前加上"Hello: "字样

2.hive中UDF函数开发步骤

  • 1)继承UDF类
  • 2)重写evaluate方法,该方法支持重载,对每条记录执行一次evaluate方法
    注意: 1.UDF必须要有返回值,可以是null,但是不能为void 2.推荐使用Text/LongWritable等hadoop类型

3.功能实现

1)新建maven工程,在pom.xml中添加UDF函数开发的依赖包,如下:

<!--cdh版本建议添加一个-->
  <repositories>
    <repository>
      <id>cloudera</id>
      <url>https://repository.cloudera.com/artifactory/cloudera-repos/</url>
    </repository>
  </repositories>

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.12</version>
      <scope>test</scope>
    </dependency>
	<!--hadoop依赖-->
    <dependency>
      <groupId>org.apache.hadoop</groupId>
      <artifactId>hadoop-common</artifactId>
      <version>2.6.0</version>
    </dependency>
    <!--hive依赖-->
    <dependency>
      <groupId>org.apache.hive</groupId>
      <artifactId>hive-exec</artifactId>
      <version>1.1.0</version>
    </dependency>
    <dependency>
      <groupId>org.apache.hive</groupId>
      <artifactId>hive-jdbc</artifactId>
      <version>1.1.0</version>
    </dependency>
  </dependencies>

2)自定义UDF函数实现

package sunyong.hive;

import org.apache.hadoop.hive.ql.exec.UDF;
import org.apache.hadoop.io.Text;

/**
 * @author sunyong
 * @date 2020/07/12
 * @description
 * 功能:输入xxx 输出:Hello: xxx
 */
public class HelloUDF extends UDF {
    public Text evaluate(Text name){
        return new Text("Hello : "+name);
    }

    public static void main(String[] args) {
        HelloUDF udf = new HelloUDF();
        System.out.println(udf.evaluate(new Text("张三")));
    }
}

3)编译jar包上传到linux本地hive的lib目录下
4)将自定义UDF函数添加到hive中去,即在hive命令行模式中执行如下命令:add jar /opt/install/hive/lib/UDF.jar;

#语法
add jar jar包绝对路径名;

5)创建函数(若在function前面有temporary,表示临时函数退出会话将会删除该函数):create function sayHello as 'sunyong.hive.HelloUDF';

#语法
create [temporary] function sayHello as '全类名(包名.类名)';

6)使用函数:select sayHello(emp_name) from employee;,效果如下:
在这里插入图片描述

4.碰到的坑:可正常添加jar包却无法创建函数

hive> create temporary function sayHello as "sunyong.hive.HelloUDF";
FAILED: Class HelloUDF not found
FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.FunctionTask
hive> create function sayHello as 'sunyong.hive.HelloUDF';
Failed to register acid_demo.sayhello using class sunyong.hive.HelloUDF
FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.FunctionTask

解决方法:

#下载zip包
yum install zip
#以下命令会删除先前jar的签名文件(-d后面参数是自己jar包的名字)
zip -d UDF.jar 'META-INF/.SF' 'META-INF/.RSA' 'META-INF/*SF'
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值