Hive-函数-UDF-UDTF

系统内置函数

1.查看系统自带的函数

show functions;

2.显示自带的函数的用法

desc function split;

3.详细显示自带的函数的用法

desc function extended split;

自定义函数

1.Hive 自带了一些函数,比如:max/min等,但是数量有限,自己可以通过自定义UDF来方便的扩展。

2.当Hive提供的内置函数无法满足你的业务处理需要时,此时就可以考虑使用用户自定义函数(UDF:user-defined function)。

3.根据用户自定义函数类别分为以下三种:

   1UDFUser-Defined-Function

          一进一出

   (2)UDAF(User-Defined Aggregation Function)

          聚集函数,多进一出

          类似于:count/max/min

   (3)UDTF(User-Defined Table-Generating Functions)

          一进多出

          如lateral view explore()

4.官方文档地址

https://cwiki.apache.org/confluence/display/Hive/HivePlugins

5.编程步骤:

1)继承org.apache.hadoop.hive.ql.UDF

2)需要实现evaluate方法;evaluate函数支持重载;

3)在hive的命令行窗口创建函数

         添加jar

         add jar linux_jar_path

         创建function

         create [temporary] function [dbname.]function_name AS class_name;

(4)在hive的命令行窗口删除函数

Drop [temporary] function [if exists] [dbname.]function_name;

6.注意事项

     UDF必须要有返回类型,可以返回null,但是返回类型不能为void;

自定义UDF函数

1.创建一个Maven工程Hive

2.导入依赖


	
	
		org.apache.hive
		hive-exec
		1.2.1
	

3.创建一个类

package com.liun.udf;

import org.apache.hadoop.hive.ql.exec.UDF;

public class MyUDF extends UDF{

	public int evaluate(int data) {
		
		return data + 5;
	}
}

4.打成jar包上传到服务器/opt/module/hive/lib/myUDF.jar

5.将jar包添加到hive的classpath

 add jar /opt/module/hive/lib/myUDF.jar;

6.创建函数与开发好的java class关联,function前加temporary为创建临时函数

create function addFive as 'com.liun.udf.MyUDF';

7.测试函数

select addFive(5);

自定义UDTF函数

1.自定义一个实现将一个任意分割符的字符串切割成独立的单词,例如:

Line:"hello,world,hadoop,hive"

Myudtf(line, ",")

hello
world
hadoop
hive

2.代码实现

package com.liun.udtf;

import java.util.ArrayList;
import java.util.List;

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;

public class MyUDTF extends GenericUDTF{

	private List dataList = new ArrayList<>();
	@Override
	public StructObjectInspector initialize(StructObjectInspector argOIs) throws UDFArgumentException {
		
		 //1.定义输出数据的列名和类型
		List fieldNames = new ArrayList<>();
		List fieldOIs = new ArrayList<>();
		
		//2.添加输出数据的列名和类型 
		fieldNames.add("word");
		fieldOIs.add(PrimitiveObjectInspectorFactory.javaStringObjectInspector);
		
		return ObjectInspectorFactory.getStandardStructObjectInspector(fieldNames, fieldOIs);
	}
	
	@Override
	public void process(Object[] args) throws HiveException {
		
		// 1.获取数据
		String data = args[0].toString();
		
		// 2.获取分隔符
		String splitKey = args[1].toString();
		
		// 3.切分数据
		String[] words = data.split(splitKey);
		
		// 4.遍历切分后的结果,并写出 
		for (String word : words) {
			
			// 5.将数据放置集合
			dataList.clear();
			dataList.add(word);
			
			// 6.将集合写出
			forward(dataList);
		}
	}

	@Override
	public void close() throws HiveException {
		// TODO Auto-generated method stub
		
	}

}

3.打成jar包上传到服务器/opt/module/hive/lib/myUDTF.jar

4.将jar包添加到hive的classpath

 add jar /opt/module/hive/lib/myUDTF.jar;

5.创建函数与开发好的java class关联,function前加temporary为创建临时函数

create function addFive as 'com.liun.udtf.MyUDTF';

6.测试函数

select MyUDTF ('hadoop,hive.spark',',');

 

你可能感兴趣的:(笔记-Hive)