赞
踩
目录
UDF全称为 User-Defined Functions, 即用户自定义函数,在Hive SQL编译成MapReduce任何时,执行java方法,类似于像MapReduce执行过程中加入一个插件,方便拓展。
UDF: 操作单个数据行,产生单个数据行;
UDAF: 执行多个数据行,产生一个数据行;
UDTF: 执行一个数据行,产生多个数据行一个表作为输出;
1)UDF,自定义一个函数,并且实现把列中的数据由大写转换成小写
2) UDTF,拆分一个表中name字段以/为分割,分成不同的列,如下所示:
表中数据:
- 1 id name
- 2
- 3 1 Lq/Sg
- 4 2 Hh
要拆分成如下格式:
- 1 id name
- 2
- 3 1 Lq
- 4 1 Sg
- 5 2 Hh
- 1 <dependency>
- 2 <groupId>org.apache.hive</groupId>
- 3 <artifactId>hive-jdbc</artifactId>
- 4 <version>2.3.0</version>
- 5 </dependency>
- 1 create table if not exists user(
- 2 id String ,
- 3 name String
- 4 );
向Hive表中插入数据:
- 1 insert into user(id,name) values ('1','Lq|Sg');
- 2 insert into user(id,name) values ('2','Hh');
UDF函数需要继承org.apache.hadoop.hive.ql.exec.UDF类,并且添加evaluate方法,原因是:UDF类默认的UDFMethodResolver是org.apache.hadoop.hive.ql.exec.DefaultUDFMethodResolver,evaluate方法是在DefaultUDFMethodResolver中进行配置,默认绑定的是evaluate方法。
添加evaluate有两个注意事项:
1)evaluate方法遵循重载的原则,参数是用户自定义的,调用那个方法调用是在使用函数时候的参数决定。
2)evaluate方法必须有返回值,返回类型以及方法参数可以是Java数据或相应的Writable类。
具体实现:
- public class MyUDF extends UDF {
- public String evaluate(String s){
- if(s == null){
- return "";
- }
- return s.toLowerCase();
- }
- }
实现:
- import org.apache.hadoop.hive.ql.exec.UDFArgumentException;
- import org.apache.hadoop.hive.ql.metadata.HiveException;
- import org.apache.hadoop.hive.ql.udf.generic.GenericUDTF;
- import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector;
- import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspectorFactory;
- import org.apache.hadoop.hive.serde2.objectinspector.StructObjectInspector;
- import org.apache.hadoop.hive.serde2.objectinspector.primitive.PrimitiveObjectInspectorFactory;
-
- import java.util.ArrayList;
- import java.util.List;
-
- public class MyUDTF extends GenericUDTF {
-
- @Override
- public StructObjectInspector initialize(StructObjectInspector argOIs) throws UDFArgumentException {
- ArrayList<String> fieldNames = new ArrayList<>();
- ArrayList<ObjectInspector> fieldTypes = new ArrayList<>();
-
- fieldNames.add("col");
- fieldTypes.add(PrimitiveObjectInspectorFactory.javaStringObjectInspector);
-
- return ObjectInspectorFactory.getStandardStructObjectInspector(fieldNames,fieldTypes);
-
- }
-
- @Override
- public void process(Object[] args) throws HiveException {
- String col = args[0].toString();
-
- String[] cols = col.split("\\/");
- for (String c : cols) {
- String[] results = new String[1];
- results[0] = c;
- forward(results);
- }
- }
-
- @Override
- public void close() throws HiveException {
-
- }
- }
上传到Linux目录,然后用add jar来添加路径
- -- 导入自定义的jar包
- add jar /root/jars/original-test_hive-1.0-SNAPSHOT.jar;
创建临时函数
- -- 创建临时函数
- create temporary function change_UDF as 'MyUDF';
- create temporary function sli_UDTF as 'MyUDTF';
创建永久函数
- -- 创建永久函数
- create function change_UDF as 'MyUDF';
- create function sli_UDTF as 'MyUDTF';
应用函数
- -- 通过函数 把字段数据转换成小写
- select change_UDF(name) as Lo_name from user;
-
- -- 通过函数把字段数据进行切分
- select sli_UDTF(name) as sli_name from user;
-
- -- 通过函数把数据拆分 然后把字段数据进行转换
- select change_UDF(u.name) from (select sli_UDTF(name) as name from user) u ;
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。