标签:函数 jar hadoop hive udf HelloUDF UDF
官方关于UDF的使用介绍:https://cwiki.apache.org/confluence/display/Hive/LanguageManual+UDF
UDF几个相关概念:
UDF: one-to-one row mapping : upper substr【进来一行出去一行】
UDAF: Aggregation Many-to-one row mapping 比如sum/min【进来多行出去一行】
UDTF: Table-generating one-to-many 比如:lateral view explode()【一对多】
编写UDF函数测试代码:
pod.xml添加hive:
<!--添加hive依赖--> <hive.version>1.1.0-cdh5.7.0</hive.version> <dependency> <groupId>org.apache.hive</groupId> <artifactId>hive-exec</artifactId> <version>${hive.version}</version> </dependency>
HelloUDF.java:
package com.ruozedata.hadoop.udf; import org.apache.hadoop.hive.ql.exec.UDF; public class HelloUDF extends UDF{ public String evaluate(String input) { //TODO...此处为开发业务逻辑的地方 return "Hello:" + input; } //下面为测试代码 public static void main(String[] args) { HelloUDF udf = new HelloUDF(); String output = udf.evaluate("测试数据"); System.out.println(output); } }
在idea中用maven打包后,上传到hive服务器;包名为:g6-hadoop-udf.jar
hive创建函数的几种方式:
方法一:创建临时函数(Temporary Functions)
官方参考:https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL#LanguageManualDDL-CreateFunction
缺点:Temporary Functions只对当前 session(窗口)有效
示例:在Hive的Shell中执行
ADD JAR /home/hadoop/lib/g6-hadoop-udf.jar;
CREATE TEMPORARY FUNCTION sayHello AS 'com.ruozedata.hadoop.udf.HelloUDF';
show functions;(执行此语句,可以看到sayHello在函数中)
select sayhello('abc') from dual;(输出的结果为:Hello:abc)
注:此种方式还有一个缺点是,jar需要每次手动add才能识别class_name
方法二:无需手动add jar包
在hive的家目录下创建auxlib目录,把jar包放在此目录下即可;
不管创建临时函数,还是持久函数,把jar放入auxlib后就无需手动进行加载;
方法三:创建持久函数(Permanent Functions),并且使用hdfs上的jar;生产建议此种方式
从hive 0.13开始,支持将函数注册到metastore中,存放的表为FUNCS(里边默认为空);
将jar包放在hdfs的/lib目录下;
示例:在Hive的Shell中执行以下命令
CREATE FUNCTION sayhello2 AS 'com.ruozedata.hadoop.udf.HelloUDF' USING JAR 'hdfs://ruozeclusterg6/lib/g6-hadoop-udf.jar';
注:此时可以任何窗口使用sayhello2函数(使用show functions无法查到,但在元数据的FUNCS表中可以看到)
查看mysql中hive库的FUNCS表;发现sayhello2已成功进行注册;
标签:函数,jar,hadoop,hive,udf,HelloUDF,UDF 来源: https://blog.51cto.com/14284607/2383598
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。