
# 开发Hive用户自定义函数
当Hive的内置函数不能满足需要时，可以通过编写用户自定义函数UDF（User-Defined Functions）插入自己的处理代码并在查询中使用它们。
按实现方式，UDF分为有如下分类：
- 普通的UDF，用于操作单个数据行，且产生一个数据行作为输出。
- 用户定义聚集函数UDAF（User-Defined Aggregating Functions），用于接受多个输入数据行，并产生一个输出数据行。
- 用户定义表生成函数UDTF(User-Defined Table-Generating Functions)，用于操作单个输入行，产生多个输出行。
按使用方法，UDF有如下分类：
- 临时函数，只能在当前会话使用，重启会话后需要重新创建。
- 永久函数，可以在多个会话中使用，不需要每次创建。
下面以编写一个AddDoublesUDF为例，说明UDF的编写和使用方法。
#### 功能介绍
AddDoublesUDF主要用来对两个及多个浮点数进行相加。在该样例中可以掌握如何编写和使用UDF。
![](https://support.huaweicloud.com/devg-mrs/public_sys-resources/note_3.0-zh-cn.png)
- 一个普通UDF必须继承自"org.apache.hadoop.hive.ql.exec.UDF"。
- 一个普通UDF必须至少实现一个evaluate()方法，evaluate函数支持重载。
 
#### 样例代码
以下为UDF示例代码。
```
package com.huawei.bigdata.hive.example.udf;
import org.apache.hadoop.hive.ql.exec.UDF;
public class AddDoublesUDF extends UDF { 
 public Double evaluate(Double... a) { 
    Double total = 0.0; 
    // 处理逻辑部分. 
    for (int i = 0; i < a.length; i++) 
      if (a[i] != null) 
        total += a[i]; 
    return total; 
  } 
}
```
#### 如何使用
1. 登录MRS Manager页面，为使用函数的Hive业务用户配置Hive管理员权限。 
   1. 登录MRS Manager页面，单击"系统配置 \> 角色管理 \> 添加角色"，添加一个拥有Hive Admin Privilege权限的角色。
   
   2. 在MRS Manager页面，单击"系统配置 \> 用户管理 "。
   
   3. 在指定用户对应的"操作"列单击"修改"。
   
   4. 为用户绑定拥有Hive Admin Privilege权限的角色，并单击"确定"完成权限添加。
   
   
   
   
2. 在项目中example目录下新建udf包，并编写AddDoublesUDF类，将项目打包(例如: AddDoublesUDF.jar)，并上传到HDFS指定目录下(如"/user/hive_examples_jars/")且创建函数的用户与使用函数的用户有该文件的可读权限。示例语句。 
   **hdfs dfs -put AddDoublesUDF.jar /user/hive_examples_jars**
   **hdfs dfs -chmod 777 /user/hive_examples_jars**
   
   
3. 如果当前集群已启用Kerberos认证，执行以下命令认证当前用户。如果当前集群未启用Kerberos认证，则无需执行此命令。当前用户为[准备Hive应用开发用户](https://support.huaweicloud.com/devg-mrs/mrs_06_0059.html)时增加的开发用户。
   
   **kinit** ***Hive业务*** ***用户***
   例如：kinit -kt '/opt/conf/user.keytab' hiveuser (user.keytab路径根据自己实际路径填写)
   
   
4. 执行**set role admin;**命令为用户赋予管理员权限。
5. 执行如下命令。 
   **beeline -n** *Hive业务用户*
   
   
6. 在Hive Server中定义该函数，以下语句用于创建永久函数。 
   **CREATE FUNCTION *addDoubles* AS 'com.huawei.bigdata.hive.example.udf.AddDoublesUDF' using jar 'hdfs://hacluster/user/hive_examples_jars/AddDoublesUDF.jar';**
   其中*addDoubles*是该函数的别名，用于SELECT查询中使用。
   以下语句用于创建临时函数。
   **CREATE TEMPORARY FUNCTION addDoubles AS 'com.huawei.bigdata.hive.example.udf.AddDoublesUDF' **using jar 'hdfs://hacluster** /user/hive_examples_jars/AddDoublesUDF.jar**'**;**
   - *addDoubles*是该函数的别名，用于SELECT查询中使用。
   
   - 关键字TEMPORARY说明该函数只在当前这个Hive Server的会话过程中定义使用。
   
   
   
   
7. 在Hive Server中使用该函数，执行SQL语句。 
   **SELECT addDoubles(1,2,3);**
   ![](https://support.huaweicloud.com/devg-mrs/public_sys-resources/note_3.0-zh-cn.png)
   若重新连接客户端再使用函数出现\[Error 10011\]的错误，可执行**reload function;**命令后再使用该函数。
   
   
8. 在Hive Server中删除该函数，执行SQL语句。 
   **DROP FUNCTION addDoubles;**
   
   
 
