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下可以通过两种方式加载驱动程序:静态加载和动态加载. 静态加载就是把驱动程序直接编译进内核,系统启动后可以直接调用.静态加载的缺点是调试起来比较麻烦,每次修改一个地方都要重新 ...
随机推荐
- java网络编程5-SSL
服务器端 System.out.println("等待客户端连接..."); File keyFile=new File("C:/Users/mu/Desktop/mu. ...
- Linux服务器 大量的CLOSE_WAIT、TIME_WAIT解决办法
http://itindex.net/detail/50213-%E6%9C%8D%E5%8A%A1%E5%99%A8-time_wait-close_wait http://itindex.net/ ...
- js转译html标签
api返回的接口数据是这样的"<div>测试数据</div>" js拼接html时会过滤掉<div></div> 所以需要对< ...
- 优化phpstorm运行卡顿问题
在PHPSTORM中点击导航菜单:Help -> Edit Custom VM Options 如果是第一次点击,会提示是否新建配置文件,点击“yse” 在弹出的编辑框末尾加上以下配置 -Daw ...
- Echoprint系列--编译
近期要做一个音乐相关的client.当中一个功能是音乐识别.搜索了一些资料选择Echoprint来开发.Echoprint是开源免费的,并且多种client都支持能节约非常多时间,今天主要下载和编译源 ...
- JavaScript------Throw和Try-Catch的使用
function test() { try { var x = document.getElementById("demo").value; if (x == "&quo ...
- [Junit] 测试方法执行顺序
Junit 4.11里增加了指定测试方法执行顺序的特性测试类的执行顺序可通过对测试类添加注解 “@FixMethodOrder(value)” 来指定,其中value 为执行顺序三种执行顺序可供选择: ...
- select标签设置只读的方法(下拉框不可选但可传值)
1. <select id="s1" name="s1" onfocus="this.defaultIndex=this.selectedInd ...
- python 清华镜像pip install
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple
- dlut1188(wanghang的迷宫)
题目链接:传送门 题目大意:从起点到终点需要最少多少步(必须要关掉所有开关才能出去) 题目思路:用一个3维数组 dp[x][y][t]表示到达当前位置x,y,已经关掉了t个开关走的最少步数,然后就 ...