hive--udf函数(开发-4种加载方式)
UDF函数开发
标准函数(UDF):以一行数据中的一列或者多列数据作为参数然后返回解雇欧式一个值的函数,同样也可以返回一个复杂的对象,例如array,map,struct。
聚合函数(UDAF):接受从零行到多行的零个到多个列,然后返回单一值。例如sum函数。
生成函数(UDTF):接受零个或者多个输入,然后产生多列或者多行输出。
udf函数开发
当Hive提供的内置函数无法满足你的业务处理需要时,此时就可以考虑使用用户自定义函数,用户自定义函数(user defined function),针对单条记录。编写一个UDF,需要继承UDF类,并实现evaluate()函数。在查询执行过程中,查询中对应的每个应用到这个函数的地方都会对这个类进行实例化。对于每行输入都会调用到evaluate()函数。而evaluate()函数处理的值会返回给Hive。同时用户是可以重载evaluate方法的。Hive会像Java的方法重载一样,自动选择匹配的方法。
准备数据:
littlebigdata.txt
edward capriolo,edward@media6degrees.com,2-12-1981,209.191.139.200,M,10
bob,bob@test.net,10-10-2004,10.10.10.1,M,50
sara connor,sara@sky.net,4-5-1974,64.64.5.1,F,2
创建表:
create table if not exists littlebigdata(
name string,
email string,
bday string,
ip string,
gender string,
anum int
)
row format delimited fields terminated by ',';
加载数据:
load data local inpath 'littlebigdata.txt' into table littlebigdata;
代码示例:
import java.text.SimpleDateFormat;
import java.util.Date;
import org.apache.hadoop.hive.ql.exec.UDF;
import org.junit.Test; public class UDFZodiacSign extends UDF { private SimpleDateFormat df ; public UDFZodiacSign() {
df = new SimpleDateFormat("MM-dd-yyyy");
} public String evaluate(Date bday){
return evaluate(bday.getMonth(),bday.getDay());
} public String evaluate(String bday){
Date date =null;
try{
date = df.parse(bday);
}
catch(Exception ex){
System.out.println("异常");
ex.printStackTrace();
return null;
}
return evaluate(date.getMonth()+1,date.getDay());
} public String evaluate(Integer month,Integer day){
if(month ==1){
if(day<20){
return "Capricorn";
}else{
return "Aquarius";
}
}
if(month ==2){
if(day<19){
return "Capricorn";
}else{
return "Pisces";
}
}
if(month ==3){
if(day<20){
return "Pisces";
}else{
return "Aries";
}
}
if(month ==4){
if(day<20){
return "Aries";
}else{
return "Taurus";
}
}
if(month ==5){
if(day<20){
return "Taurus";
}else{
return "Gemini";
}
}
if(month ==6){
if(day<21){
return "Gemini";
}else{
return "Cancer";
}
}
if(month ==7){
if(day<22){
return "Cancer";
}else{
return "Leo";
}
}
if(month ==8){
if(day<23){
return "Leo";
}else{
return "Virgo";
}
}
if(month ==9){
if(day<22){
return "Virgo";
}else{
return "Libra";
}
}
if(month ==10){
if(day<24){
return "Libra";
}else{
return "Scorpio";
}
}
if(month ==11){
if(day<22){
return "Scorpio";
}else{
return "Sagittarius";
}
}
if(month ==12){
if(day<22){
return "Sagittarius";
}else{
return "Capricorn";
}
} return null;
}
@Test
public void test() { UDFZodiacSign aa = new UDFZodiacSign();
String str = aa.evaluate("01-10-2004");
System.out.println(str);
} }
udf代码示例
函数使用
加载:
add jar testUDF-0.0.1-SNAPSHOT.jar;
create temporary function zodiac as "cn.rtmap.bigdata.hive.testUDF.udf.UDFZodiacSign";
查询:
select name,bday,zodiac(bday) from littlebigdata;
结果:
edward capriolo 2-12-1981 Capricorn
bob 10-10-2004 Libra
sara connor 4-5-1974 Aries
注意:这个地方可能有报错,反正我是遇到了!
解决办法:
UDF四种加载方式
第一种:
第二种:
<property>
<name>hive.aux.jars.path</name>
<value>file:///jarpath/all_new1.jar,file:///jarpath/all_new2.jar</value>
</property>
第三种:
第四种:
hive--udf函数(开发-4种加载方式)的更多相关文章
- Android Activity四种加载方式
Android之四种加载方式 (http://marshal.easymorse.com/archives/2950 图片) 在多Activity开发中,有可能是自己应用之间的Activity跳转,或 ...
- Linux共享库两种加载方式简述
Linux共享库两种加载方式简述 动态库技术通常能减少程序的大小,节省空间,提高效率,具有很高的灵活性,对于升级软件版本也更加容易.与静态库不同,动态库里面的函数不是执行程序本身 的一部分,而是 ...
- Android学习笔记_50_(转 四种加载方式详解(standard singleTop singleTask singleInstance)
Android之四种加载方式 (http://marshal.easymorse.com/archives/2950 图片) 在多Activity开发中,有可能是自己应用之间的Activity跳转,或 ...
- Android 四种加载方式详解(standard singleTop singleTask singleInstance) .
Android之四种加载方式 (http://marshal.easymorse.com/archives/2950 图片) 在多Activity开发中,有可能是自己应用之间的Activity跳转,或 ...
- Xamarin Android Fragment的两种加载方式
android Fragment的重点: 3.0版本后引入,即minSdk要大于11 Fragment需要嵌套在Activity中使用,当然也可以嵌套到另外一个Fragment中,但这个被嵌套的Fra ...
- 二、从GitHub浏览Prism示例代码的方式入门WPF下的Prism之Modules的几种加载方式
这一篇梳理Prism中07示例Module的几种加载方式. 07示例分为了5个,有5种不同的Module加载方式. 我们开始学习加载Modules 观察07-Modules-Appconfig示例 分 ...
- dll的两种加载方式(pend)+ delayload
看过关于动态库的调用例子,于是决定动手做一做:dll的对外接口声明头文件,Mydll.h: //Mydll.h #include <stdio.h> #include <stdlib ...
- ios 图片的两种加载方式
控件加载图片,plist,懒加载,序列帧动画,添加动画效果. IOS中有2种加载图片的方式. 方式一:有缓存(图片所占用的内存会一直停留在程序中) + (UIImage *)imageNamed:(N ...
- Linux驱动的两种加载方式过程分析
一.概念简述 在Linux下可以通过两种方式加载驱动程序:静态加载和动态加载. 静态加载就是把驱动程序直接编译进内核,系统启动后可以直接调用.静态加载的缺点是调试起来比较麻烦,每次修改一个地方都要重新 ...
随机推荐
- 2017-2018 ACM-ICPC, NEERC, Northern Subregional Contest D Dividing Marbles
题目大意: 给出一个$N(N <= 2^{22}$),$N$的二进制表示中1的个数不超过4. 一开始有一个集合$S = {N}$, 每次操作可以选择$n\in S \ (n > 1)$, ...
- 基于Bootstrap样式的 jQuery UI 控件 (v0.5).
网址:http://www.shouce.ren/example/show/s/6444#download-bootstrap
- Linux 系统时间设置
from:https://blog.csdn.net/yjh314/article/details/51669238 今早看到一台机器时间对不上,本以为系统时间与网络北京时间不同步,就在终端命令执行网 ...
- 第九篇:使用 lstat 函数获取文件信息
前言 在之前的文章中,描述过如何用 fcntl 函数改变文件的状态标记.但,文件还有很多信息,如文件类型,权限设置,设备编号,访问时间等等.如果要获取这些信息,则使用函数 lstat 可以轻松达到这个 ...
- 简易新闻网站NewsWeb-网页抓取
本文转载自姚虎才子 今天做项目时用到java抓取网页内容,本以为很简单的一件事但是还是让我蛋疼了一会,网上资料一大堆但是都是通过url抓取网页内容,但是我要的是读取本地的html页面内容的方法,网上找 ...
- GS与NGP通信(不断跟新)
- [hihoCoder] 后序遍历
The key of this problem is that we need not build the tree from scratch. In fact, we can direct obta ...
- 【转】SpringMVC 拦截器
类似于Servlet开发中的过滤器Filter,用于对处理器进行预处理和后处理. 常用场景: 1.日志记录:记录请求信息的日志,以便进行信息监控.信息统计.计算PV(Page View)等. 2.权限 ...
- mysqldump迁移说明
使用mysqldump导出数据, 数据包含单行insert,带字段值 #使用mysqldump备份数据到文件, 主要在每个分片的主上面进行备份,确保数据是最新的. mysqldump -h192. - ...
- MySQL 索引性能分析概要
上一篇文章 MySQL 索引设计概要 介绍了影响索引设计的几大因素,包括过滤因子.索引片的宽窄与大小以及匹配列和过滤列.在文章的后半部分介绍了 数据库索引设计与优化 一书中,理想的三星索引的设计流程和 ...