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

注意:这个地方可能有报错,反正我是遇到了!

解决办法:

1,修改jdk的版本 可能版本太高。
2,删除META-INF 文件中*.SF的文件,这个是依赖包有冲突导致的。
3.在MANIFEST.MF 中添加Main-Class: cn.rtmap.bigdata.hive.testUDF.udf.UDFZodiacSign,这个可以在maven中创建好。

UDF四种加载方式

第一种:

是最常见但也不招人喜欢的方式是使用ADD JAR(s)语句,之所以说是不招人喜欢是,通过该方式添加的jar文件只存在于当前会话中,当会话关闭后不能够继续使用该jar文件,最常见的问题是创建了永久函数到metastore中,再次使用该函数时却提示ClassNotFoundException。所以使用该方式每次都要使用ADD JAR(s)语句添加相关的jar文件到Classpath中。

第二种:

是修改hive-site.xml文件。修改参数hive.aux.jars.path的值指向UDF文件所在的路径。,该参数需要手动添加到hive-site.xml文件中。
<property>
<name>hive.aux.jars.path</name>
<value>file:///jarpath/all_new1.jar,file:///jarpath/all_new2.jar</value>
</property>

 第三种:

是在${HIVE_HOME}下创建auxlib目录,将UDF文件放到该目录中,这样hive在启动时会将其中的jar文件加载到classpath中。(推荐)

 第四种:

是设置HIVE_AUX_JARS_PATH环境变量,变量的值为放置jar文件的目录,可以拷贝${HIVE_HOME}/conf中的hive-env.sh.template为hive-env.sh文件,并修改最后一行的#export HIVE_AUX_JARS_PATH=为exportHIVE_AUX_JARS_PATH=jar文件目录来实现,或者在系统中直接添加HIVE_AUX_JARS_PATH环境变量。

hive--udf函数(开发-4种加载方式)的更多相关文章

  1. Android Activity四种加载方式

    Android之四种加载方式 (http://marshal.easymorse.com/archives/2950 图片) 在多Activity开发中,有可能是自己应用之间的Activity跳转,或 ...

  2. Linux共享库两种加载方式简述

      Linux共享库两种加载方式简述  动态库技术通常能减少程序的大小,节省空间,提高效率,具有很高的灵活性,对于升级软件版本也更加容易.与静态库不同,动态库里面的函数不是执行程序本身 的一部分,而是 ...

  3. Android学习笔记_50_(转 四种加载方式详解(standard singleTop singleTask singleInstance)

    Android之四种加载方式 (http://marshal.easymorse.com/archives/2950 图片) 在多Activity开发中,有可能是自己应用之间的Activity跳转,或 ...

  4. Android 四种加载方式详解(standard singleTop singleTask singleInstance) .

    Android之四种加载方式 (http://marshal.easymorse.com/archives/2950 图片) 在多Activity开发中,有可能是自己应用之间的Activity跳转,或 ...

  5. Xamarin Android Fragment的两种加载方式

    android Fragment的重点: 3.0版本后引入,即minSdk要大于11 Fragment需要嵌套在Activity中使用,当然也可以嵌套到另外一个Fragment中,但这个被嵌套的Fra ...

  6. 二、从GitHub浏览Prism示例代码的方式入门WPF下的Prism之Modules的几种加载方式

    这一篇梳理Prism中07示例Module的几种加载方式. 07示例分为了5个,有5种不同的Module加载方式. 我们开始学习加载Modules 观察07-Modules-Appconfig示例 分 ...

  7. dll的两种加载方式(pend)+ delayload

    看过关于动态库的调用例子,于是决定动手做一做:dll的对外接口声明头文件,Mydll.h: //Mydll.h #include <stdio.h> #include <stdlib ...

  8. ios 图片的两种加载方式

    控件加载图片,plist,懒加载,序列帧动画,添加动画效果. IOS中有2种加载图片的方式. 方式一:有缓存(图片所占用的内存会一直停留在程序中) + (UIImage *)imageNamed:(N ...

  9. Linux驱动的两种加载方式过程分析

    一.概念简述 在Linux下可以通过两种方式加载驱动程序:静态加载和动态加载. 静态加载就是把驱动程序直接编译进内核,系统启动后可以直接调用.静态加载的缺点是调试起来比较麻烦,每次修改一个地方都要重新 ...

随机推荐

  1. 运行jsp需要安装_______Web服务器。

    运行jsp需要安装_______Web服务器. A.Apache B.tomcat C.WebLogic D.IIS 解答:BC Apache是PHP程序运行的服务器,IIS是.net程序运行的服务器 ...

  2. Container类是Component的子类,它也是一个抽象类,它允许其他的组件(Component)加入其中

    在AWT中,所有能在屏幕上显示的组件(component )对应的类,均是 抽象类 Component 的子类或子孙类. 这些类均可继承Component类的变量和方法. Container类是Com ...

  3. mac os下android 通过battery-historian进行电量分析

    简单介绍下如何用battery-historian进行电量分析,因为battery-hostorian是基于go语言的框架,所以需要安装go 1.安装go 2.配置go环境变量到.bash_profi ...

  4. Hourrank 21 Tree Isomorphism 树hash

    https://www.hackerrank.com/contests/hourrank-21/challenges/tree-isomorphism 题目大意: 给出一棵树, 求有多少本质不同的子树 ...

  5. QT软件初次使用中遇到的若干问题及思考

    1.QT窗口名称汉字设置问题? 答案:在MSVC中试用诸多方法,亲测都不行. 解决方案1:创建项目时,选择使用MSGW方案,用gcc进行编译,即可解决 2.QT中ui文件中组件不能再.cpp文件中显示 ...

  6. 线程池ThreadPool详解

    http://www.cnblogs.com/kissdodog/archive/2013/03/28/2986026.html 一.CLR线程池 管理线程开销最好的方式: 尽量少的创建线程并且能将线 ...

  7. linux连接mysql命令

    连接MYSQL: 格式: mysql -h主机地址 -u用户名 -p用户密码 1.例1:连接到本机上的MYSQL 找到mysql的安装目录,一般可以直接键入命令mysql -uroot -p,回车后提 ...

  8. JAVA基础面试(五5)

    41.a.hashCode() 有什么用?与 a.equals(b) 有什么关系?        hashCode() 方法对应对象整型的 hash 值.它常用于基于 hash 的集合类,如 Hash ...

  9. 【BZOJ4345】[POI2016]Korale 堆(模拟搜索)

    [BZOJ4345][POI2016]Korale Description 有n个带标号的珠子,第i个珠子的价值为a[i].现在你可以选择若干个珠子组成项链(也可以一个都不选),项链的价值为所有珠子的 ...

  10. npm and node 的一些问题

    1. node 安装 n 模块 用来管理 node的版本 2.  初始化项目出现这个问题 Error: Attempt to unlock XXX, which hasn't been locked ...