博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HIVE udf实例
阅读量:6198 次
发布时间:2019-06-21

本文共 3232 字,大约阅读时间需要 10 分钟。

本例中udf来自《hive编程指南》其中13章自定义函数中一个例子。

 

按照步骤,第一步,建立一个项目,创建 GenericUDFNvl 类。

/** * 不能接受第一个参数为null的情况  * 测试过,不是很好用 */package hive.udf;import org.apache.hadoop.hive.ql.exec.Description;import org.apache.hadoop.hive.ql.exec.UDFArgumentException;import org.apache.hadoop.hive.ql.exec.UDFArgumentLengthException;import org.apache.hadoop.hive.ql.exec.UDFArgumentTypeException;import org.apache.hadoop.hive.ql.metadata.HiveException;import org.apache.hadoop.hive.ql.udf.generic.GenericUDF;import org.apache.hadoop.hive.ql.udf.generic.GenericUDFUtils;import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector;@Description(    name = "nvl",    value = "_FUNC_(value,default_value) - Returns default value if value is nul else returns value",    extended = "Example:\n> SELECT _FUNC_(NULL, 'bla') FROM src LIMIT 1;")public class GenericUDFNvl extends GenericUDF {    private GenericUDFUtils.ReturnObjectInspectorResolver returnOIResolver;    private ObjectInspector[] argumentOIs;    @Override    public ObjectInspector initialize(ObjectInspector[] arguments) throws UDFArgumentException {        argumentOIs = arguments;        if (arguments.length != 2) {            throw new UDFArgumentLengthException("The operator 'NVL' accepts 2 arguments.");        }        returnOIResolver = new GenericUDFUtils.ReturnObjectInspectorResolver(true);        if (!(returnOIResolver.update(arguments[0]) && returnOIResolver.update(arguments[1]))) {            throw new UDFArgumentTypeException(2,                    "THe 1st and 2nd args of function NVL should have the same type, "                    + "but they are different: \"" + arguments[0].getTypeName()                    + "\" and \"" + arguments[1].getTypeName() + "\"");                    }        return returnOIResolver.get();    }    @Override    public Object evaluate(DeferredObject[] arguments) throws HiveException {        Object retVal = returnOIResolver.convertIfNecessary("", argumentOIs[0]);        //if (retVal == null) {
retVal = returnOIResolver.convertIfNecessary(arguments[1], argumentOIs[1]); //} return retVal; } @Override public String getDisplayString(String[] children) { StringBuilder sb = new StringBuilder(); sb.append("if "); sb.append(children[0]); sb.append(" is null "); sb.append("returns"); sb.append(children[1]); return sb.toString(); }}

 

创建完成之后,在项目中点右键->Export->JAR file,再下一步中选中刚刚创建的这个文件,将文件导出为.jar文件。

 

接下来,进入hive的 CLI,执行

hive> add jar /home/user/udfnvl.jar;  

hive> create temporary function nvl as "hive.udf.GenericUDFNvl";

hive> desc function nvl;

OK
nvl(value,default_value) - Returns default value if value is nul else returns value
Time taken: 0.169 seconds
hive> desc function extended nvl;
OK
nvl(value,default_value) - Returns default value if value is nul else returns value
Example:
> SELECT nvl(NULL, 'bla') FROM src LIMIT 1;

Time taken: 0.051 seconds

以上的整个过程比较简单,有很多UDF的例子,可以在github中找到,如https://github.com/apache/hive/blob/master/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFEncode.java

但也有一些需要注意的地方,就是导出项目jar包时需要关注一下jdk的版本,需要与执行环境一致,否则会报 Unsupported major.minor version 52.0 这样的错误。

转载于:https://www.cnblogs.com/gromit409/p/7688458.html

你可能感兴趣的文章
CentOS下配置java环境变量classpath
查看>>
请注意,再次记住, centos7,fedora 24中 没有iptables服务, 而使用的firewalld, 也可以安装 iptables-services程序来实现...
查看>>
Atitit 索引技术--位图索引
查看>>
(转)Image Segmentation with Tensorflow using CNNs and Conditional Random Fields
查看>>
PHP存储blob示例(转)
查看>>
js获取系统的根路径实现介绍
查看>>
如何动静分离?
查看>>
linux信任公钥的配置
查看>>
【转载】Restful 简介
查看>>
spring结合mybatis实现数据库读写分离
查看>>
JQuery选择所有标题的元素
查看>>
RestTemplate发送请求并携带header信息
查看>>
Spring JavaConfig @Import实例
查看>>
VS2012发布网站详细步骤问题
查看>>
PowerDesigner
查看>>
JAVA PERSISTENCE API (JPA)
查看>>
浅谈深度学习
查看>>
Linux驱动技术(五) _设备阻塞/非阻塞读写
查看>>
fakeroot: preload library `libfakeroot.so' not found, aborting.
查看>>
第一届“百度杯”信息安全攻防总决赛
查看>>