更新时间:2023-09-14 GMT+08:00

用户自定义函数

当Hive的内置函数不能满足需要时,可以通过编写用户自定义函数UDF(User-Defined Functions)插入自己的处理代码并在查询中使用它们。

按实现方式,UDF分为有如下分类:

  • 普通的UDF,用于操作单个数据行,且产生一个数据行作为输出。
  • 用户定义聚集函数UDAF(User-Defined Aggregating Functions),用于接受多个输入数据行,并产生一个输出数据行。
  • 用户定义表生成函数UDTF(User-Defined Table-Generating Functions),用于操作单个输入行,产生多个输出行。

按使用方法,UDF有如下分类:

  • 临时函数,只能在当前会话使用,重启会话后需要重新创建。
  • 永久函数,可以在多个会话中使用,不需要每次创建。

下面以编写一个AddDoublesUDF为例,说明UDF的编写和使用方法。

功能介绍

AddDoublesUDF主要用来对两个及多个浮点数进行相加。在该样例中可以掌握如何编写和使用UDF。

  • 一个普通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认证,则无需执行此命令。当前用户为准备开发用户时增加的开发用户。

    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);

    若重新连接客户端再使用函数出现[Error 10011]的错误,可执行reload function;命令后再使用该函数。

  8. 在Hive Server中删除该函数,执行SQL语句。

    DROP FUNCTION addDoubles;