hive创建udf函数流程

news/2025/1/3 8:11:12/

1.编写udf函数

引入pom文件

<dependencies>
    <dependency>

<!-- 这个属于额外的jar包 自己按需引用 比如你想搞得函数 里面要连接mysql 这里肯定需要引入mysql的驱动包 我这个包是为了计算字符串的表达式的。 -->
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-jexl3</artifactId>
        <version>3.1</version>
    </dependency>
    <dependency> <!-- 这个只需provided即可,因为服务器有hive环境-->
        <groupId>org.apache.hive</groupId>
        <artifactId>hive-exec</artifactId>
        <version>3.1.2</version>
        <scope>provided</scope>
    </dependency>
</dependencies>

先确定好你要写什么函数比如我要写一个 计算字符串表达式。

 

 开始继承hive的udf接口,有很多小伙伴这个时候就喜欢看别人是怎么写的,这个时候就是体现个人差距的时候了,如何不看别人文档自己写呢?比如没网的条件下?

抄别人的 为啥不直接抄hive的呢? 想想hive什么udf函数最简单,lower/upper。照着抄就行。

public class StringCal extends GenericUDF 实现三个方法

initialize 初始化 校验参数的

evaluate 真正执行的方法

getDisplayString: desc function时 打印的话


import org.apache.commons.jexl3.JexlBuilder;
import org.apache.commons.jexl3.JexlEngine;
import org.apache.commons.jexl3.JexlExpression;
import org.apache.hadoop.hive.ql.exec.Description;
import org.apache.hadoop.hive.ql.exec.UDFArgumentException;
import org.apache.hadoop.hive.ql.exec.UDFArgumentLengthException;
import org.apache.hadoop.hive.ql.metadata.HiveException;
import org.apache.hadoop.hive.ql.udf.generic.GenericUDF;
import org.apache.hadoop.hive.ql.udf.generic.GenericUDFUtils;
import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector;
import org.apache.hadoop.hive.serde2.objectinspector.PrimitiveObjectInspector;
import org.apache.hadoop.hive.serde2.objectinspector.primitive.PrimitiveObjectInspectorConverter;
import org.apache.hadoop.hive.serde2.objectinspector.primitive.PrimitiveObjectInspectorFactory;
import org.apache.hadoop.hive.serde2.typeinfo.BaseCharTypeInfo;
import org.apache.hadoop.hive.serde2.typeinfo.TypeInfoFactory;
//有时间的这里写下,免得后面自己都不知道是干嘛的了。
@Description(name = "StringCal",value = "_FUNC_(str) - Returns str with calculate result",extended = "Example:\n"+ "  > SELECT _FUNC_('1+(-1+2.0-3.0+(4.0-5.0))+3.1-4.1+2*3+1.1*4') FROM src LIMIT 1;\n" + "  '-7.2'")
public class StringCal extends GenericUDF {private transient PrimitiveObjectInspector argumentOI;private transient PrimitiveObjectInspectorConverter.StringConverter stringConverter;private transient PrimitiveObjectInspector.PrimitiveCategory returnType = PrimitiveObjectInspector.PrimitiveCategory.STRING;private transient GenericUDFUtils.StringHelper returnHelper;//这里一大串校验,校验是不是普通类型啥的,校验是字符串还是啥,哪那么多事,反正照着抄就行,不写也没啥你自己定义的函数,别人也不会用。@Overridepublic ObjectInspector initialize(ObjectInspector[] arguments) throws UDFArgumentException {if (arguments.length != 1) {throw new UDFArgumentLengthException("StringCal requires 1 argument, got " + arguments.length);}if (arguments[0].getCategory() != ObjectInspector.Category.PRIMITIVE) {throw new UDFArgumentException("StringCal only takes primitive types, got " + argumentOI.getTypeName());}argumentOI = (PrimitiveObjectInspector) arguments[0];stringConverter = new PrimitiveObjectInspectorConverter.StringConverter(argumentOI);PrimitiveObjectInspector.PrimitiveCategory inputType = argumentOI.getPrimitiveCategory();ObjectInspector outputOI = null;BaseCharTypeInfo typeInfo;switch (inputType) {case CHAR:// return type should have same length as the input.returnType = inputType;typeInfo = TypeInfoFactory.getCharTypeInfo(GenericUDFUtils.StringHelper.getFixedStringSizeForType(argumentOI));outputOI = PrimitiveObjectInspectorFactory.getPrimitiveWritableObjectInspector(typeInfo);break;case VARCHAR:// return type should have same length as the input.returnType = inputType;typeInfo = TypeInfoFactory.getVarcharTypeInfo(GenericUDFUtils.StringHelper.getFixedStringSizeForType(argumentOI));outputOI = PrimitiveObjectInspectorFactory.getPrimitiveWritableObjectInspector(typeInfo);break;default:returnType = PrimitiveObjectInspector.PrimitiveCategory.STRING;outputOI = PrimitiveObjectInspectorFactory.writableStringObjectInspector;break;}returnHelper = new GenericUDFUtils.StringHelper(returnType);return outputOI;}@Overridepublic Object evaluate(DeferredObject[] arguments) throws HiveException {String val = null;if (arguments[0] != null) {val = (String) stringConverter.convert(arguments[0].get());}if (val == null) {return null;}
//就这里是我自己写的 其他的都是抄的lowerUdf的。
//        String expressionString = "1+(-1+2.0-3.0+(4.0-5.0))+3.1-4.1+2*3+1.1*4";JexlEngine jexlEngine = new JexlBuilder().create();JexlExpression jexlExpression = jexlEngine.createExpression(val);Object evaluate = jexlExpression.evaluate(null);return returnHelper.setReturnValue(evaluate.toString());}@Overridepublic String getDisplayString(String[] children) {return null;}
}

然后打包成一个jar,上传的hdfs

 我嫌弃打的包不好听就直接改了个名字。

然后创建函数

create function default.stringCal as 'com.tencent.s2.function.StringCal' using jar 'hdfs:///user/hive/function/stringcalculate.jar';

注意啊 这里加上数据库的名字,否则退出会话就没了。

 这里我创建了两次。就是因为没加数据库的名字,反正建议各位加下。

也可以 

 drop function dwdmdata.stringcal

 最后享受下劳动成果。有精度误差,无伤大雅。 


http://www.ppmy.cn/news/295749.html

相关文章

[游戏开发][Unity]Assetbundle加载篇(11)

[游戏开发][Unity]Assetbundle加载篇&#xff08;10&#xff09;

继续:个人微信的自动收款解决(思路)

1. 安装PaddleOCR 2. 手机adb截图 3. PaddleOCR识别截图

超市的收款机的钱箱为什么每次都要弹开

这个问题其实我一直没搞明白。我是刷卡结账&#xff0c; 不涉及现金&#xff0c; 为什么收款机的钱盒还要弹开一次&#xff1f;然后收款员再推回去&#xff1f;这里有什么不可逾越的技术障碍吗&#xff1f;我只能认为这个是收款机制造公司加快机器损耗的办法了。随着以后电子支…

LED背光源运用于小型收款机

各类收款机的背光源型号还是有很大的区别的&#xff0c;有小型取款类型的背光源&#xff0c;也有台式收款的背光源显示屏等&#xff0c;在相较于其他的普遍背光源中&#xff0c;小型收款机背光源产品是现在金雄兴主推的一款产品&#xff0c;技术相当成熟拥有众多同行业案例。采…

嵌入式linux收银机重装系统,收银机重装系统。没有光驱,用U盘怎么装?详细点的。谢了!...

满意答案 _cfj0316 2016.01.24 采纳率&#xff1a;45% 等级&#xff1a;11 已帮助&#xff1a;15413人 你可以按如下方法作启动盘&#xff1a; 1、将U盘格式化为启动盘(USB-ZIP型)。U盘驱动光盘上有安装程序&#xff0c;安装完后在“程序”组下能找到U盘程序项&#xff0c;利…

**工控机 爱宝收银台 专用Win7系统32位纯尽版**

爱宝收银台是由广州市贺氏办公设备有限公司研制&#xff0c;搭载着专用工控windows7系统&#xff0c;此系统对硬件配置不高的机器运行非常流畅&#xff0c;展开到C盘不到10G。 原机提取又重新优化制作&#xff0c;可更好的在目前工控机上运行&#xff0c;杀软检测无毒无风险。…

android好还是windows好,收银机操作系统哪种好?安卓系统与Windows系统区别?

POS收银机从结构上来讲&#xff0c;本质就是一台PC机加上其他的外围设备&#xff0c;收银机的PC机我们称之为主机&#xff0c;内部配置跟普通的PC一样&#xff0c;CPU、硬盘、主板、内存一样也不能少&#xff0c;当然也少不了PC赖以运行的操作系统了。那么&#xff0c;POS收银机…

收银机收款机USB通讯接口(341驱动) 可以用于客显 小票打印机

补充说明 若在管理软件的输入过程中&#xff0c;拼音输入法出现半角状态被自动转换为全角&#xff0c;请先关闭软件&#xff0c;安装“输入法补丁”然后再运行软件。 M系列收款机带USB接口的机型&#xff0c;请执行以下操作。 连接计算机后&#xff0c;操作系统右下角会有“发…