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;}@Testpublic 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环境变量。

转载于:https://www.cnblogs.com/chushiyaoyue/p/6632090.html

hive--udf函数(开发-4种加载方式)相关推荐

  1. 动态链接库dll的两种加载方式

    在第一篇技术博客"动态链接库简介"中说到了两种加载方式,当时没有详细说明,这里详细说明一下 可以通过两种方式 1.隐式链接(需要.dll,.lib,.h) 2.显式链接(需要.dl ...

  2. ios首次加载web_IOS_IOS中UIWebView的使用详解,一、初始化与三种加载方式 UI - phpStudy...

    IOS中UIWebView的使用详解 一.初始化与三种加载方式 UIWebView继承与UIView,因此,其初始化方法和一般的view一样,通过alloc和init进行初始化,其加载数据的方式有三种 ...

  3. Android图片加载之认识bitmap的四种加载方式

    Android的Bitmap有四种高效加载方式 从获取方式分: (1)以文件流的方式 假设在sdcard下有 test.png图片 FileInputStream fis = new FileInpu ...

  4. 最新完整代码:使用word2vec预训练模型进行增量训练(两种保存方式对应的两种加载方式)适用gensim各种版本

    两种方式加载预训练模型(保存方式不一样,加载方式也不一样) 以腾讯训练的100为word2vec small版本为例 word2vec预训练模型下载 腾讯:https://ai.tencent.com ...

  5. MyBatis 延迟加载的三种加载方式深入,你get了吗?

    延迟加载 延迟加载对主对象都是直接加载,只有对关联对象是延迟加载. 延迟加载可以减轻数据库的压力, 延迟加载不可是一条SQL查询多表信息,这样构不成延迟加载,会形成直接加载. 延迟加载分为三种类型: ...

  6. 百度地图API的两种加载方式

    1. 同步加载 直接在页面中使用script标签,引入api地址即可,如下: <script src="http://api.map.baidu.com/api?v=2.0&a ...

  7. HBase协处理器三种加载方式

    一.协处理器简介 HBase协助处理器允许用户将部分逻辑在数据存放端即 HBase RegionServer 服务端进行计算,也即允许用户在 RegionServer 运行用户自定义的代码.这相当于是 ...

  8. C语言startup()函数,WSAStartup()函数以及DLL的加载

    本节讲解 Windows 下 DLL 的加载,学习 Linux Socket 的读者可以跳过. WinSock(Windows Socket)编程依赖于系统提供的动态链接库(DLL),有两个版本: 较 ...

  9. Entity Framework关联实体的三种加载方法

    推荐文章 EF性能之关联加载 总结很好 一:介绍三种加载方式 Entity Framework作为一个优秀的ORM框架,它使得操作数据库就像操作内存中的数据一样,但是这种抽象是有性能代价的,故鱼和熊掌 ...

最新文章

  1. CG-CTF-Web-文件包含
  2. oracle下lag和lead分析函数
  3. Python自定义类的成员并不一直是所有对象共享的
  4. LeetCode算法题-Delete Node in a Linked List(Java实现)
  5. Mysql基础之 事务
  6. Spring JPA 使用@CreatedDate、@CreatedBy、@LastModifiedDate、@LastModifiedBy 自动生成时间和修改者...
  7. Linux系统压缩解压缩
  8. 测试用例设计——正交实验法
  9. 家用风扇控制系统c语言程序设计,[信息与通信]家用风扇控制系统.doc
  10. 不知道rar压缩包密码可以解密么,rar压缩包有密码怎么解开?
  11. 全国计算机高新技术作用,全国计算机高新技术考试证书作用是什么?
  12. 外贸独立站和外贸电商平台优劣势分析
  13. Hi ! 哈希,Hash
  14. 你必须收藏的快速学习Autodesk最新编程接口的免费录像
  15. XUPT-ACM校赛心得
  16. [乐意黎原创]PHP抛PHP Startup:Unable to load dynamic library bcmath,Libmcrypt,mhash,mcrypt等警告及模块动态安装详解
  17. js实现幻灯片轮播图
  18. ios开发---音乐播放器之怎么获取音乐列表
  19. 树莓派4B搜不到5G WiFi ???
  20. 使用Matlab软件对NDVI进行最大值合成

热门文章

  1. Sql Server实用操作-动态sql语句基本语法
  2. IT兄弟连 JavaWeb教程 MVC设计模式
  3. Robust 源代码分析之gradle-plugin
  4. 2019值得每天闲逛的网站
  5. 一些长时间GC停顿问题的排查及解决办法
  6. 爬虫进阶教程:极验(GEETEST)验证码破解教程
  7. python读取caffemodel文件
  8. CTE 中字符串拼接
  9. 写给初学前端工程师的一封信 (转于Kejun)
  10. Redis附加功能之键过期功能