Hive中实现自定义函数UDF详细过程

来源:互联网 发布:java list sort方法 编辑:程序博客网 时间:2024/05/18 15:06

Hive的UDF,其实很类似Mysql之类的自定义函数

不过它需要用java来编写,而不是用传统的SQL来完成

实现一个UDF的步骤如下:

  1. 实现一个Java Class,继承自UDF
  2. 打成jar包,并加入到Hive的ClassPath中
  3. 生成自定义函数,执行select
  4. 删除刚才创建的临时函数

下面这个UDF,是我给hive的array增加的一个函数

用来判断array中是否包含某个值,hive的标准函数中并没有此功能函数

12345678910111213141516171819202122232425262728293031323334
package com.sohu.hadoop.hive.udf;import java.util.*;import org.apache.hadoop.hive.ql.exec.UDF;import org.apache.hadoop.io.Text;import org.apache.hadoop.io.BooleanWritable;import org.apache.hadoop.io.Text; public final class ArrayContains extends UDF {   public BooleanWritable evaluate(ArrayList<String> arr,Text ele)    {        BooleanWritable rtn = new BooleanWritable(false);        if (arr == null || arr.size() < 1)        {            return rtn;        }        try {            String cstr = ele.toString();               for (String str : arr)            {                if (str.equals(cstr))                {                    rtn = new BooleanWritable(true);                    break;                }            }         } catch (Exception e) {            e.printStackTrace();        }         return rtn;    }}

然后执行编译打包:

javac -classpath /opt/hadoop_client/hadoop/hadoop-0.20.2+228-core.jar:/opt/hadoop_client/hive/lib/hive-exec-0.5.0.jar src/com/sohu/hadoop/hive/udf/ArrayContains.java -d build
jar -cvf hadooop-mc-udf.jar -C build .

最后执行Hive QL查询:

hive -e "add jar /opt/ysz/udf/hadooop-mc-udf.jar;drop temporary function array_contains;create temporary function array_contains as 'com.sohu.hadoop.hive.udf.ArrayContains';select suv,channelid from pvlog_pre where array_contains(channelid,'2')"

原创粉丝点击