Hive的自定义的函数的步骤:

1°、自定义UDF extends org.apache.hadoop.hive.ql.exec.UDF

2°、需要实现evaluate函数,evaluate函数支持重载

3°、把程序打包放到目标机器上去

4°、进入hive客户端,添加jar包:hive>add jar jar路径

5°、创建临时函数:hive> create temporary function 自定义名称 AS '自定义UDF的全类名'

6°、执行HQL语句;

7°、销毁临时函数:hive> drop temporary function 自定义名称

在hive的hive-exec-1.0.0.jar中有如下结构(这是Hive中的内嵌函数的源码):

举一个例子:是<hive编程指南>中的一个经典案例.

统计显示生效和星座

输入日期显示字符串.

如果是0就显示生肖,如果是1就显示星座.

示例代码如下:

 import java.sql.Date;
import java.text.SimpleDateFormat;
import java.util.Calendar; import org.apache.hadoop.hive.ql.exec.UDF;
import org.apache.hadoop.io.Text;
import org.junit.Test; public class UDFZodiacAndConstellation extends UDF {
public Text evaluate(Date date, int type) {
// 这个地方Date的类型是java.sql.Date,和数据库打交道的都是这个.
// 还可以用DateWritable,这个类面封装了一个java.sql.Date类型.
java.util.Date uDate = new java.util.Date(date.getTime());
if (type == 0) {// 生肖
return new Text(getZodica(uDate));
} else if (type == 1) {// 星座
return new Text(getConstellation(uDate));
} else {
return new Text("NULL");
}
} public final String[] zodiacArr = { "猴", "鸡", "狗", "猪", "鼠", "牛", "虎", "兔","龙", "蛇", "马", "羊" };
public final String[] constellationArr = { "水瓶座", "双鱼座", "白羊座", "金牛座","双子座", "巨蟹座", "狮子座", "处女座",
"天秤座", "天蝎座", "射手座", "魔羯座" };
public final int[] constellationEdgeDay = { 20, 19, 21, 21, 21, 22, 23, 23, 23, 23, 22, 22 }; /**
* 根据日期获取生肖
*/
public String getZodica(java.util.Date date) {
Calendar cal = Calendar.getInstance();
cal.setTime(date);
return zodiacArr[cal.get(Calendar.YEAR) % 12];
} /**
* 根据日期获取星座
*/
public String getConstellation(java.util.Date date) {
if (date == null) {
return "";
}
Calendar cal = Calendar.getInstance();
cal.setTime(date);
int month = cal.get(Calendar.MONTH);
int day = cal.get(Calendar.DAY_OF_MONTH);
if (day < constellationEdgeDay[month]) {
month = month - 1;
}
if (month >= 0) {
return constellationArr[month];
}
// default to return 魔羯
return constellationArr[11];
} /**
* 测试方法
*/
@Test
public void test() throws Exception {
System.out.println(getConstellation(new SimpleDateFormat("yyyy-MM-dd").parse("2016-07-09")));
System.out.println(getConstellation(new SimpleDateFormat("yyyy-MM-dd").parse("2016-07-31")));
System.out.println(getZodica(new SimpleDateFormat("yyyy-MM-dd").parse("2016-07-31")));
}
}

然后对这个java文件打包放到Linux中,此处是放到了/usr/local/data/calc-cz.jar

show functions 能够找到这个创建的cz函数.

查看该自定义函数的函数描述:

在jar源代码包中看关于hive内置year函数的源码:

可以仿照这个内置的函数在编写自定义hive函数的时候,定义函数的描述description.

year函数在hive中的描述

关于上面自定义的函数的在hive中的具体使用不再详述......

Hive中自定义函数的更多相关文章

  1. [转]hive中自定义函数(UDAF)实现多行字符串拼接为一行

    函数如何使用: hive> desc concat_test;OKa       intb       string hive> select * from concat_test;OK1 ...

  2. 【Hive】自定义函数

    Hive的自定义函数无法满足实际业务的需要,所以为了扩展性,Hive官方提供了自定义函数来实现需要的业务场景. 1.定义 (1)udf(user defined function):  自定义函数,特 ...

  3. Hadoop生态圈-hive编写自定义函数

    Hadoop生态圈-hive编写自定义函数 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.

  4. Hadoop生态圈-Hive的自定义函数之UDTF(User-Defined Table-Generating Functions)

    Hadoop生态圈-Hive的自定义函数之UDTF(User-Defined Table-Generating Functions) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.

  5. Hadoop生态圈-Hive的自定义函数之UDAF(User-Defined Aggregation Function)

    Hadoop生态圈-Hive的自定义函数之UDAF(User-Defined Aggregation Function) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.

  6. Hadoop生态圈-Hive的自定义函数之UDF(User-Defined-Function)

    Hadoop生态圈-Hive的自定义函数之UDF(User-Defined-Function) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.

  7. Hive中日期函数总结

    --Hive中日期函数总结: --1.时间戳函数 --日期转时间戳:从1970-01-01 00:00:00 UTC到指定时间的秒数 select unix_timestamp(); --获得当前时区 ...

  8. hive中标准偏差函数stddev()详细讲解

    1.标准偏差概念 标准偏差(Std Dev,Standard Deviation) -统计学名词.一种度量数据分布的分散程度之标准,用以衡量数据值偏离算术平均值的程度.标准偏差越小,这些值偏离平均值就 ...

  9. Hive中如何添加自定义UDF函数以及oozie中使用hive的自定义函数

    操作步骤: 1. 修改.hiverc文件 在hive的conf文件夹下面,如果没有.hiverc文件,手工自己创建一个. 参照如下格式添加: add jar /usr/local/hive/exter ...

随机推荐

  1. cocos2d-x获得系统的语言

    获得手机系统的语言 CCSize winSize = CCDirector::sharedDirector()->getWinSize(); CCLabelTTF *label = CCLabe ...

  2. (转载)Linux启动过程详解

    启动第一步--加载BIOS当你打开计算机电源,计算机会首先加载BIOS信息,BIOS信息是如此的重要,以至于计算机必须在最开始就找到它.这是因为BIOS中包含了CPU的相关信息.设备启动顺序信息.硬盘 ...

  3. JSF 2 graphicImage example

    In JSF, you can use <h:graphicImage /> tag to render a HTML "img" element. For examp ...

  4. POJ 3660 Cow Contest (Floyd)

    http://poj.org/problem?id=3660 题目大意:n头牛两两比赛经过m场比赛后能判断名次的有几头可转 化为路径问题,用Floyd将能够到达的路径标记为1,如果一个点能 够到达剩余 ...

  5. UVaLive 7359 Sum Kind Of Problem (数学,水题)

    题意:给定一个n,求前 n 个正整数,正奇数,正偶数之和. 析:没什么好说的,用前 n 项和公式即可. 代码如下: #pragma comment(linker, "/STACK:10240 ...

  6. dao 获取表最大排序实现

    public Long getMaxOrder(Long parentId) { Query query = this.getSession().createSQLQuery( "selec ...

  7. Laravel入门笔记

    Laravel 是一款简洁,优雅的一款框架,可以说是入门TP后的第二款可以选择的框架. 目录部分: app -> 自己写的代码 http -> Controller -> 控制器 b ...

  8. assert函数(python)

    assert语句: 用以检查某一条件是否为True,若该条件为False则会给出一个AssertionError. 用法: assert type(x)=int and x>=0 如果不满足后面 ...

  9. Oracle DataGuard 物理Standby 搭建(下)

    主备库切换 Switchover 一般SWITCHOVER切换都是计划中的切换,特点是在切换后,不会丢失任何的数据,而且这个过程是可逆的,整个DATA GUARD环境不会被破坏,原来DATA GUAR ...

  10. 2015南阳CCPC E - Ba Gua Zhen 高斯消元 xor最大

    Ba Gua Zhen Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 无 Description During the Three-Kingdom perio ...