Hive的UDF的自定义

当hive为我们提供的UDF无法满足要求的时候,我们可以开发自己的UDF,我们自己的UDF类需要继承org.apache.hadoop.hive.ql.exec.UDF类
并且在类中实现evaluate方法,当我们在hive中使用自定义的UDF的时候,hive会调用类中的evaluate方法来实现特定的功能。
如下是一个返回字符串的长度的用户自定义UDF:
package com.zx.hive.udf;

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

public class UdfTestLength extends UDF{

    public Integer evaluate(String s)
    {
        if(s==null)
        {
            return null;
        }else{
            return s.length();
        }
    }
}

将上面的类打成jar的形式,我使用eclipse直接导出为test-udf.jar包,然后放在/home/zhangxin/hive目录中。
然后,进入到hive的命令行界面:
>hive
//首先将jar包添加到hive中
add jar /home/zhangxin/hive/test-udf.jar
//给UDF定义别名
create temporary function testlength as 'com.zx.hive.udf.UdfTestLength';
//在查询语句中使用UDF
select testlength(a.name) from test_join1 a;

自定义函数可以重载:如下的UDF既可以对两个整数进行相加,也可以对两个double进行相加。
package com.zx.hive.udf;
import org.apache.hadoop.hive.ql.exec.UDF;
public class UdfTestAdd  extends UDF{

    public Integer evaluate(Integer a,Integer b)
    {
        return a+b;
    }
   
    public Double evaluate(Double a,Double b)
    {
        return a+b;
    }
}


add jar /home/zhangxin/hive/test-udf.jar
//给UDF定义别名
create temporary function testadd as 'com.zx.hive.udf.UdfTestAdd';
//在查询语句中使用UDF
select testadd(1,2) from test_join1 a;

3


select testadd(1.2,2.2) from test_join1 a;

3.4000000000000004

在使用 UDF 的时候,会自动进行类型转换,这个 java 或者 C 中的类型转换有些类似,比如:

  SELECT example_add(1, 2.1) FROM src;

的结果是 3.1,这是因为 UDF 将类型为 Int 的参数 “1″ 转换为 double。

类型的隐式转换是通过 UDFResolver 来进行控制的,并且可以根据不同的 UDF 进行不同的控制。

UDF 还可以支持变长的参数,例如 UDFExampleAdd.java:

  public class UDFExampleAdd extends UDF {
    public Integer evaluate(Integer... a) {
      int total = 0;
      for (int i=0; i<a.length; i++)
        if (a[i] != null) total += a[i];

      return total;
  } // the same for Double public Double evaluate(Double... a) }

使用例子为:

  SELECT example_add(1, 2) FROM src;
  SELECT example_add(1, 2, 3) FROM src;
  SELECT example_add(1, 2, 3, 4.1) FROM src;

综上,UDF 具有以下特性:

    * 用 java 写 UDF 很容易。
    * Hadoop 的 Writables/Text 具有较高性能。
    * UDF 可以被重载。
    * Hive 支持隐式类型转换。
    * UDF 支持变长的参数。
    * genericUDF 提供了较好的性能(避免了反射)。

你可能感兴趣的:(hive)