`
yugouai
  • 浏览: 497534 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Hive自定义函数(generic)

 
阅读更多

Hive自定义generic(通用)函数,性能比simple性能高,同时能处理simple不能处理的问题,如:simple不能处理Hive的struct结构。

 

hive generic 函数详细见hive 目录:

src\ql\src\java\org\apache\hadoop\hive\ql\udf\generic

 

 

一、GenericUDF

1.UDF首先将输入数据转化为对应的ObjectInspectors对象

 

2.Hive自带的很多函数都是使用GenericUDF,例如:concat_ws, case when等等

 

3.UDF输入是单行数据,产生一个数据输出。

 

编写GenericUDF步骤:

 

1.继承GenericUDF类,实现以下3个方法:

 

public ObjectInspector initialize(ObjectInspector[] arguments)
public Object evaluate(DeferredObject[] arguments)
public String getDisplayString(String[] children)

 

2.initialize方法在SQL调用UDF函数中,首先被调用,它完成下面4件事:

(1)验证输入的类型是否预期输入

(2)设置返回值,设置返回一个与预期输出类型相符的ObjectInspector ,假设需要返回的是一个string类型,由于string类型对应的分布式类型是TextWritable,所以在initialize返回的类型是

 

return PrimitiveObjectInspectorFactory.writableStringObjectInspector;

 (3)存储在全局变量的ObjectInspectors元素的输入

 

 (4)设置存储变量的输出

其中第三步不是必须的,因为全局变量能在evaluate方法中以局部变量的形式声明并处理,但是在initialize存储全局变量,只需要初始化一次。

 

3.evaluate方法:处理函数从输入到输出的逻辑,返回函数处理预期结果的值

 

(1)第一步:将输入值,声明局部变量通过initialize方法判断合法的变量存储。

(2)第二步:处理函数逻辑,将输入通过代码逻辑得到结果并返回。

其中,Hive中的变量类型与Java中的变量类型的匹配:

hive类型 java类型
array<> ArrayList<>
struct<> Object

其他类似于hadoop的变量类型,如:string对应hadoop 的TextWritable等等。

 

4.getDisplayString方法

(1)用于explain sql的时候,方便查看其返回的格式

(2)类似于java的toString方法

 

案例分析:

 

该案例实现,输入一个用户编号user_id,一个游戏列表game_list,输出是用户与随机游戏列表中的一款游戏,以逗号分隔:user_id,game,在hive外层使用split函数将其划分,得到用户随机的一款游戏。

源码分析:

 

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.GenericUDF;
import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector;
import org.apache.hadoop.hive.serde2.objectinspector.StandardListObjectInspector;
import org.apache.hadoop.hive.serde2.objectinspector.primitive.PrimitiveObjectInspectorFactory;
import org.apache.hadoop.io.Text;

/**
 * 随机用户匹配游戏列表中的一款游戏
 * 
 * @author huzhirong
 * 
 */
public class UDFRandomUidGame extends GenericUDF {

        //声明全局输入变量
	StandardListObjectInspector dimGameListOI;
	ObjectInspector uidOI;
        //声明输出变量
	private final Text text = new Text();
	
        //处理业务逻辑
	@Override
	public Object evaluate(DeferredObject[] vals) throws HiveException {
		text.clear();
		Text uid = (Text) vals[0].get();
		Text seq = new Text(",");
		@SuppressWarnings("unchecked")
		List<Text> list = (List<Text>) dimGameListOI.getList(vals[1].get());
		Text game = list.get((int) (Math.random() * list.size()));
		text.append(game.getBytes(), 0, game.getLength());
		text.append(seq.getBytes(), 0, seq.getLength());
		text.append(uid.getBytes(), 0, uid.getLength());
		return text;
	}

        //类似于java的toString方法,hive中在使用explain的时候调用该方法
	@Override
	public String getDisplayString(String[] args) {
		StringBuilder sb = new StringBuilder();
		if (args != null && args.length > 0) {
			for (String arg : args) {
				sb.append(arg).append(',');
			}
		}
		if (sb.length() > 0) {
			sb.setCharAt(sb.length() - 1, ')');
		} else {
			sb.append(')');
		}
		sb.insert(0, "random_list_element(");

		return sb.toString();
	}

	@Override
	public ObjectInspector initialize(ObjectInspector[] ois)  throws UDFArgumentException {
		uidOI = (ObjectInspector)ois[0];
		dimGameListOI = (StandardListObjectInspector)ois[1];
                //返回值类型
		return PrimitiveObjectInspectorFactory.writableStringObjectInspector;
	}

}

 

 

 

分享到:
评论

相关推荐

    Hive的Udf函数进行数据脱敏

    Hive 的 User Defined Functions (UDFs) 是用户自定义函数,允许开发者扩展Hive的功能,以满足特定的数据处理需求。在这个场景中,我们关注的是如何使用UDF进行数据脱敏,特别是对敏感信息进行处理,例如手机号码、...

    base64加密解密的hive udf函数

    2. 编写一个名为`Base64UDF`的类,继承`org.apache.hadoop.hive.ql.udf.generic.GenericUDF`。这个类将包含加密和解密方法。 ```java import org.apache.hadoop.hive.ql.exec.UDFArgumentException; import org....

    hive UDF需要jar包

    在Hive中,UDF(User Defined Functions)是用户自定义函数,允许开发人员扩展Hive的内置功能,以满足特定的数据处理需求。Hive UDF的实现通常涉及到编写Java代码,并将其打包成JAR(Java Archive)文件,然后在Hive...

    各种情况手机号清洗udf函数(hive impala)

    3. **Hive UDF**:在Hive中,我们可以创建自定义函数(UDF)来处理特定的数据清洗任务。首先,你需要编写一个Java类,该类继承自`org.apache.hadoop.hive.ql.udf.generic.GenericUDF`,并实现`evaluate`方法,该方法...

    hive按月份加减udf范例

    在Hive中,UDF(User Defined Function)是用户自定义函数,允许我们扩展Hive的功能以满足特定的业务需求。本示例主要讲解如何在Hive中实现按月份的加减操作,这在时间序列分析或周期性报告中非常常见。 标题"hive...

    cloudera-hive-cdh6.3.2源码包

    Hive 允许用户自定义函数(UDF),以满足特定的计算需求。源码中的 `udf` 模块包含了内置的 UDF 实现,用户也可以根据 `org.apache.hadoop.hive.ql.udf.generic.GenericUDF` 接口开发自己的 UDF。 8. **Hive ...

    获取最大分区UDTF函数.doc

    接下来,在Hive中创建永久自定义函数: ```sql drop function if exists maxParts; CREATE FUNCTION maxParts AS 'com.mingyang.GetMaxPartitionsUDTF' USING JAR 'hdfs://nameservice1/user/lib/max-partitions.jar...

    AES解密UDF函数.doc

    它允许开发人员根据特定需求编写自定义的数据处理逻辑,并将其集成到Hive SQL查询中。本篇文章将详细介绍如何在Hive环境中实现AES解密功能的UDF函数,包括其设计思路、实现步骤以及最终的应用测试。 #### 二、AES...

    获取规范货币类型UDF函数.doc

    UDF(用户自定义函数) 在Hive中,UDF允许用户扩展Hive的功能,以满足更复杂的数据处理需求。UDF可以用于处理单个值或一列数据,并返回一个处理后的结果。在本案例中,我们将创建一个名为`NormCurrencyType`的UDF...

    HiveExtension

    UDFS是Hive中的用户自定义函数(User-Defined Function)的一个子类,它扩展了Hive的功能,使我们能够处理不常见的数据格式或者实现特定的文件操作。 创建Hive UDFS的过程通常包括以下几个步骤: 1. **定义UDFS类**...

Global site tag (gtag.js) - Google Analytics