UDF(PYTHON / JAVA)入门级开发
开发前的声明
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)入门级开发相关推荐
- Python + Django 入门级开发手顺
Python + Django 入门级开发手顺 一.python 简介 1.1 安装python 解释器,网址:Welcome to Python.org,没啥说的老规矩双击下一步(ps:python ...
- java和python的web自动化有什么区别-Java Web开发和Python Web开发之间的区别
今天的文章讨论了Java Web开发和Python Web开发之间的区别.我不鼓励我们在这里从Java Web迁移到Python Web开发.我只是想谈谈我的感受.它不一定适合所有情况,仅供我们参考. ...
- 前端 python java三者哪个比较容易就业_前端和后端(Java)开发哪个难?,哪个学习容易一点?...
关于前端和后端java学习难以程度,以下是我的分享. 难易程度: web前端开发 起点低.容易入门,相对于Java来说,前端对于逻辑思维的要求比较低,所以学习前端也要容易一些,所以你不用担心学不会.很 ...
- 软件测试/测试开发丨Java or Python?测试开发工程师如何选择合适的编程语言?
很多测试开发工程师尤其是刚入行的同学对编程语言和技术栈选择问题特别关注,毕竟掌握一门编程语言要花不少时间成本,也直接关系到未来的面试和就业(不同企业/项目对技术栈要求也不一样),根据自身情况做一个相对 ...
- python爬虫豆瓣读书top250+数据清洗+数据库+Java后端开发+Echarts数据可视化(四)
之前的博客已经写了python爬取豆瓣读书top250的相关信息和清洗数据.将数据导入数据库并创建相应的数据表,以及进行项目准备工作,接下来开始正式编写后台代码. 如果有没看懂的或是不了解上一部分说的 ...
- 高薪聘请2021/2022届本/硕/博数学、物理、统计、计算机、软件等专业 1、量化软件开发工程师(本科211以上)base北上杭深关键词:c++、python、java软件开发
高薪聘请2021/2022届本/硕/博 数学.物理.统计.计算机.软件等专业 1.量化软件开发工程师 (本科211以上)base北上杭深 关键词:c++.python.java软件开发 年40-70万 ...
- jave与python区别_简述JAVA后端开发与python后端开发的区别
今天总算闲了一会,趁着这个闲暇来写篇文章. 今天我想以个人观点来简单说说Java后端开发和Python后端开发的区别. Java&Python BackEnd 公众号老粉可能知道公众号以前的名 ...
- java web开发初学_2018年学习Web开发的绝对初学者指南
java web开发初学 This post was originally published on Coder-Coder.com. 该帖子最初发布在Coder-Coder.com上 . If yo ...
- java培训分享:java软件开发可以用哪些软件?
从事java相关工作的小伙伴应该都有一个习惯,那就是运用软件的方便来达到高效率工作,本期小编为大家介绍的java培训教程就是关于"java软件开发可以用哪些软件?"的内容,来看看下 ...
最新文章
- Python3 AttributeError: module 'cv2' has no attribute 'SIFT'
- 【编码】对qsort函数的稳定排序优化-京东实习笔试编程题(一)-2016.04.08
- 动态规划之最长公共子序列(LCS)
- echarts图表的内边距_echarts——各个配置项详细说明总结
- Nginx配置相关结构划分的技巧和禁止IP访问
- 少儿编程150讲轻松学Scratch(八)-如何设计经典游戏打砖块
- Android ViewRoot、DecorViewWindow浅析
- oracle中distinct和group by的区别
- java data 图像 显示_Java(JMF)获取本地摄像头,实时显示图像
- webtest 文章
- 基于CSS3的3D旋转效果
- 【matlab】元胞数组(使用celldisp显示元胞数组)
- 替换分隔符 ^p, 或者是回车
- SOA安全性解决方案
- 计算机视觉基础概念、运行原理和应用案例详解
- 福昕阅读器中批量删除注释
- 有一只会射子弹的贪食蛇,你见过吗?
- 前端展示json格式数组
- 六十二、基础框架(二十)集合物件
- 浅谈golang中的代理模式
热门文章
- JavaScript元素定位
- QQ 表情存在“恶意彩蛋”?腾讯回应是 Bug
- 什么是4K H.265解码?一起来深度了解下
- 如何在模拟器上调用RealPlayer播放流媒体(转)
- SPSS Clementine 数据挖掘入门
- JavaScript面向对象焦点图片轮播banner
- Xshell 7 报提示: 要继续使用此程序,您必须应用最新的更新或使用新版本
- INCA - A2L文件
- 华为路由器ACL简单配置
- 数据增强:FactMix: Using a Few Labeled In-domain Examples to Generalize to Cross-domain Named Entity Reco