博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Hive UDF开发-简介
阅读量:4992 次
发布时间:2019-06-12

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

Hive进行UDF开发十分简单,此处所说UDF为Temporary的function,所以需要hive版本在0.4.0以上才可以。

Hive的UDF开发只需要重构UDF类的evaluate函数即可。例:

package com.hrj.hive.udf;

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

public class helloUDF extends UDF {

    public String evaluate(String str) {

        try {

            return "HelloWorld " + str;

        } catch (Exception e) {

            return null;

        }

    }

 

将该java文件编译成helloudf.jar

hive> add jar helloudf.jar;

hive> create temporary function helloworld as 'com.hrj.hive.udf.helloUDF';

hive> select helloworld(t.col1) from t limit 10;

hive> drop temporary function helloworld;

 

注:

1.helloworld为临时的函数,所以每次进入hive都需要add jar以及create temporary操作

2.UDF只能实现一进一出的操作,如果需要实现多进一出,则需要实现UDAF

转自: http://www.cnblogs.com/end/archive/2012/10/12/2721543.html

 

除此之外,我们也可以创建非临时的UDF,然后将其部署到服务器上。

1 编写UDF类

以简单的处理单个字段的UDF函数为例,开发自定义UDF函数需要继承’org.apache.hadoop.hive.ql.exec.UDF’类.

可以通过Maven添加,pom文件中加入(版本号跟Hive版本一致即可):

org.apache.hive
hive-exec
0.13.1

 最简单的实现只需继承UDF类,并实现evaluate函数.如下UDF函数用来将IP(v4)地址转换为整数.

package com.liam8.hive;    import org.apache.hadoop.hive.ql.exec.Description;    import org.apache.hadoop.hive.ql.exec.UDF;    /**    * Convert IPv4 to a num which type is Long in java.    * Created by Liam on 2016/4/11.    */    @Description(name = "IpToNum", value = "_FUNC_(ip) - Convert IPv4 to a num(long).")    public class IpToNum extends UDF {      public long evaluate(String ip) {          String[] nums = ip.split("\\.");          return Long.parseLong(nums[3]) + Long.parseLong(nums[2]) * 256             + Long.parseLong(nums[1]) * 65536 + Long.parseLong(nums[0]) * 16777216;      }    }

 

evaluate方法的输入输出即是UDF函数的输入输出.

Description注解部分提供函数的帮助信息.
执行:desc function test.iptonum
输出:
test.iptonum(ip) - Convert IPv4 to a num(long).

源码已上传

2 部署及创建UDF函数

PS:Hive0.13及以后版本适用

部署jar包

将jar包复制到HDFS.

hdfs -dfs -put udfs-0.1.jar 'hdfs:///user/hadoop/hiveUDF'

 

创建永久函数

需在Hive中执行sql语句,格式如下:

CREATE FUNCTION [db_name.]function_name AS class_name[USING JAR|FILE|ARCHIVE 'file_uri' [, JAR|FILE|ARCHIVE 'file_uri'] ];

如:

create function test.iptonum as 'com.liam8.hive.IpToNum' using jar 'hdfs:///user/hadoop/hiveUDF/udfs-0.1.jar'

 

函数需要属于某个库,如这里是’test’,当其他库调用时,需要加上库名,如’test.iptonum’.

调用方式: select test.iptonum('127.0.0.1');

创建临时函数

临时函数只在当前session中有效,临时函数不能指定库.

create temporary function iptonum as 'com.liam8.hive.IpToNum' using jar 'hdfs:///user/hadoop/hiveUDF/udfs-0.1.jar'

 调用方式: select iptonum('127.0.0.1');

4 参考资料

原文地址:

 
 
 

转载于:https://www.cnblogs.com/niceofday/p/6418803.html

你可能感兴趣的文章
现代计算机接口实验 (三)8255实验
查看>>
spring——获取ClassLoader
查看>>
javascript函数
查看>>
luogu4093 序列 (cdq分治优化dp)
查看>>
BZOJ 2588: Spoj 10628. Count on a tree( LCA + 主席树 )
查看>>
从零开始学算法(一)
查看>>
d3d 纹理坐标1:1对应到屏幕坐标.
查看>>
SQL Server优化器特性-隐式谓词
查看>>
国内不谈Java--硅谷有感
查看>>
hdu3371
查看>>
zoj1456 Minimum Transport Cost
查看>>
悬挂else引发的问题
查看>>
js题集29--部分题目在线答题链接地址
查看>>
PCLint 帮助中关于如何获得gcc/g++编译宏定义和头文件搜索目录的方法说明
查看>>
依赖注入模式
查看>>
Backbone.js之Todo源码浅析
查看>>
传统软件企业之殇
查看>>
[bzoj4491]我也不知道题目名字是什么
查看>>
CSS pusle雷达动画实现
查看>>
【问题解决方案】之 Word 公式编辑器 使用小tips
查看>>