开发前的声明

        udf开发是在数据分析的时候如果内置的函数解析不了的情况下去做的开发,比方说你只想拆分一个字段,拼接一个字段之类的,就不要去搞udf了,这种基本的需求自带函数完全支持,具体参数可参考文档:

spark-sql内置函数

里面列举了所有函数的介绍和使用,推荐优先使用官方推出的,因为自己写的udf如果对一些异常处理不到位可能会导致数据分析的失败或者意想不到的情况。但是内置的函数真的满足不了那就真的没办法了,比如在做数据分析的时候经常使用的是ip解析,这个通常就需要自己开发udf了。

优质UDF开发示例:

(1)、节假日日期筛选        (2)、UDF开发流程

常见错误:

(1)、Error : java 不支持发行版本X

pom文件查询配置: jar包配置搜索官方地址:http://mvnrepository.com/

udf的分类

udf平常用的多的也就两种,一种java写的,一种python 所写,下面对这两种情况分别做个简单的demo供大家参考。

udf for java(idea)

1.创建maven工程

file->project structure->modules->点击+号->new module->选择maven

点击next,填写groupid(对应包结构)、artifactid(maven仓库对应的坐标)

source java 代码,操作如下图file->project structure, 

点击apply或者ok,

2.开始写java代码

pom文件添加依赖

    <dependencies><!--添加Hive依赖--><dependency><groupId>org.apache.hive</groupId><artifactId>hive-exec</artifactId><version>2.0.0</version></dependency><!--添加Hadoop依赖--><dependency><groupId>org.apache.hadoop</groupId><artifactId>hadoop-common</artifactId><version>2.6.5</version></dependency><dependency><groupId>jdk.tools</groupId><artifactId>jdk.tools</artifactId><version>1.6</version><scope>system</scope></dependency></dependencies>

java - main主函数:

package com.songheng.UDF;import org.apache.hadoop.hive.ql.exec.UDF;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;/*** 1、继承 UDF 接口*/
public class URLDecode extends UDF {/*** 传参有一些特殊字符,比如%号或者说+号,导致不能解析 所以要进行转换* @param parameter* @return*/public String recursionParser(String parameter) {String decodeParameter = "";try {decodeParameter = URLDecoder.decode(parameter.replaceAll("%(?![0-9a-fA-F]{2})", "%25").replaceAll("\\+", "%2B"), "utf-8");} catch (UnsupportedEncodingException e) {return parameter;}return decodeParameter;}/*** 2、重写evaluate方法*/public String evaluate(String input) {return recursionParser(input);}public static void main(String[] args){URLDecode udf = new URLDecode();String result = udf.evaluate("%E4%B8%AD%E5%9B%BD");System.out.println(result);}
}

3.生成jar包上传到hdfs参考文章

在此项目pom文件的路径下执行mvn clean install

将target文件中生成的jar文件上传到hdfs上,路径自己自定义,我直接上传到/。

sudo -u hdfs hdfs dfs -put UrlDecodeUDF.jar /user/olicity/hive/UDF/

4.使用hivesql或者sparksql加载自定义函数

1、添加 jar 包:
add jar /user/olicity/hive/UDF/UrlDecodeUDF.jar;      2、查看导入的 jar 包:
list jars;     3、创建一个名为 myHiveUrlDecodeUDF 的临时函数,关联该jar包:
create temporary function myHiveUrlDecodeUDF as 'com.songheng.UDF.URLDecode';4、查看创建的函数:
show functions;-----------------------------
注意:上述方法仅限于当前会话生效,如需要添加一个永久的函数对应的永久的路径,则需要将jar包放到hdfs上,然后创建函数关联路径即可:
create function locUDF.myHiveUrlDecodeUDF as 'com.songheng.UDF.URLDecode' using jar 'hdfs://hdfs路径/UrlDecodeUDF.jar';use myHiveUrlDecodeUDF;-----------------------------
另外还看到过另一种方法,配置hive-site.xml文件中的hive.aux.jars.path
配置参考如下:<property><name>hive.aux.jars.path</name><value>file:///home/hdfs/fangjs/DefTextInputFormat.jar,file:///jarpath/test.jar</value></property>
【测试sql】:select myHiveUrlDecodeUDF("%E4%B8%AD%E5%9B%BD") as word;>word
中国

udf for python

python udf入门我就不重新阐述了,我看到有一位同学的博客写的很清晰,推荐博客

https://blog.csdn.net/qq_26937525/article/details/54136317

存在的问题:   

在数据清洗过程中,因为Python是直接向系统申请资源的,而不是像JAVA是向yarn的ResourceManager申请资源,如果使用的是TransForm而不是UDF的话,会导致启动的Python脚本对内存和CPU的使用不可控,尤其是当启动多个Map时,因为一个map将启动一个Python因此,当同时运行的map有几十个时(测试集群较小),同时将尝试启动相同个数的python(资源够用的话仍然会启动几十个),且此时Map占用的内存是不会释放掉的他在一直等待Python的结果,这将导致python可用的资源仅仅是原本分配给系统的很少的资源(注:在安装Hadoop时,对于单个节点,一般仅仅给系统留出很少的内存,其他的内存全部分给了集群。例如32G物理内存的节点给系统和dataNode+nodeManager的内存就4-8个G,同时CPU核数也不足节点的一半,剩余的内存和cpu核数全部划分给集群使用。需要注意的是,这里虽然说是划分给集群使用,仅仅是逻辑上的划分,即规定集群可以使用的最大的物理内存,超过该内存时MR可以认为是不会抢占分配给系统+DataNode+nodeManager的内存的,但是当集群中没有MR在执行,即没有map或者reduce在执行时,划分给集群的这部分资源是可以被系统使用的。而若有map和Reduce在执行时,运行map和reduce的JVM的资源不会因为系统进程需要使用而被释放掉)所以,所有正在执行的Map一直在等待python的运行结果而没有释放掉其自身占用的资源,故python无法使用分配给集群的资源而只能使用预留给系统+nodeManager+DataNode的4-8G的内存和很少的cpu核数。因此会导致集群的资源无法被高效利用。
         综上,使用Transform(Python)执行效率低的根本原因在于Python是直接向操作系统申请资源,而不是向YARN的ResourceManager申请资源,故而导致节点的资源无法高效组织和被利用。此外,不要轻易使用transform!不要轻易使用transform!不要轻易使用transform

UDF(PYTHON / JAVA)入门级开发相关推荐

  1. Python + Django 入门级开发手顺

    Python + Django 入门级开发手顺 一.python 简介 1.1 安装python 解释器,网址:Welcome to Python.org,没啥说的老规矩双击下一步(ps:python ...

  2. java和python的web自动化有什么区别-Java Web开发和Python Web开发之间的区别

    今天的文章讨论了Java Web开发和Python Web开发之间的区别.我不鼓励我们在这里从Java Web迁移到Python Web开发.我只是想谈谈我的感受.它不一定适合所有情况,仅供我们参考. ...

  3. 前端 python java三者哪个比较容易就业_前端和后端(Java)开发哪个难?,哪个学习容易一点?...

    关于前端和后端java学习难以程度,以下是我的分享. 难易程度: web前端开发 起点低.容易入门,相对于Java来说,前端对于逻辑思维的要求比较低,所以学习前端也要容易一些,所以你不用担心学不会.很 ...

  4. 软件测试/测试开发丨Java or Python?测试开发工程师如何选择合适的编程语言?

    很多测试开发工程师尤其是刚入行的同学对编程语言和技术栈选择问题特别关注,毕竟掌握一门编程语言要花不少时间成本,也直接关系到未来的面试和就业(不同企业/项目对技术栈要求也不一样),根据自身情况做一个相对 ...

  5. python爬虫豆瓣读书top250+数据清洗+数据库+Java后端开发+Echarts数据可视化(四)

    之前的博客已经写了python爬取豆瓣读书top250的相关信息和清洗数据.将数据导入数据库并创建相应的数据表,以及进行项目准备工作,接下来开始正式编写后台代码. 如果有没看懂的或是不了解上一部分说的 ...

  6. 高薪聘请2021/2022届本/硕/博数学、物理、统计、计算机、软件等专业 1、量化软件开发工程师(本科211以上)base北上杭深关键词:c++、python、java软件开发

    高薪聘请2021/2022届本/硕/博 数学.物理.统计.计算机.软件等专业 1.量化软件开发工程师 (本科211以上)base北上杭深 关键词:c++.python.java软件开发 年40-70万 ...

  7. jave与python区别_简述JAVA后端开发与python后端开发的区别

    今天总算闲了一会,趁着这个闲暇来写篇文章. 今天我想以个人观点来简单说说Java后端开发和Python后端开发的区别. Java&Python BackEnd 公众号老粉可能知道公众号以前的名 ...

  8. java web开发初学_2018年学习Web开发的绝对初学者指南

    java web开发初学 This post was originally published on Coder-Coder.com. 该帖子最初发布在Coder-Coder.com上 . If yo ...

  9. java培训分享:java软件开发可以用哪些软件?

    从事java相关工作的小伙伴应该都有一个习惯,那就是运用软件的方便来达到高效率工作,本期小编为大家介绍的java培训教程就是关于"java软件开发可以用哪些软件?"的内容,来看看下 ...

最新文章

  1. 《可扩展的艺术》内容回顾与作者采访
  2. 常用的JVM参数,你现在就记好!
  3. git clone错误 fatal: early EOF fatal: index-pack failed
  4. 区块链BaaS云服务(13)广州微链GGC全球游戏链(Global Game Chain)
  5. Html轻松使用拖拽实现垃圾桶,代码带注释,包你能看懂
  6. 记录下Linux难记实用的命令
  7. 夏末浅笑_2014年夏末大Java新闻
  8. VUE:checkbox 单选框(单选、多选)、一选全选 / 全选一选、表格单选列实现
  9. qt退出 整个应用程序_为什么要对整个应用程序使用功能组合
  10. 五 .3D-2D:PnP问题求解 非线性法BA
  11. 精通HTML5+CSS3需要学什么?
  12. 微信小程序 自动解决分包大小问题_一个小小的优化,能让你的小程序瘦身10%...
  13. DDA数值微分法详解
  14. java mysql聊天室_java实现聊天室的简单实现
  15. ndows优化大师 免费版,Windows优化大师
  16. 椭圆函数与模函数(2012.10出版)(2013-01-16 09:34:57)
  17. 黄山行之《黄山前山游》
  18. 项目思维导图软件测试分析,在软件测试中使用思维导图技术
  19. github上比较好用的第三方
  20. element步骤条实战

热门文章

  1. Python从基础到精通day8
  2. 技术学习里程 | 数字图像处理
  3. 美国公司连续加班36个小时,只为给华为“多发货”
  4. windows10无法搜索计算机,简单几步解决win10电脑搜索功能不能用了的问题
  5. mac qq怎么删除全部聊天记录
  6. 记录一次sysupdate 和 networkservice 的清除脚本记录
  7. 实时天气api, API接口调用实况天气 2019
  8. Verilog负数赋值与加法运算
  9. flex 影响兄弟元素宽度问题
  10. JAVA实现打字练习软件