hive创建udf函数流程

这篇具有很好参考价值的文章主要介绍了hive创建udf函数流程。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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的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;

//这里一大串校验,校验是不是普通类型啥的,校验是字符串还是啥,哪那么多事,反正照着抄就行,不写也没啥你自己定义的函数,别人也不会用。
    @Override
    public 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;
    }

    @Override
    public 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());
    }

    @Override
    public String getDisplayString(String[] children) {
        return null;
    }
}

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

hive创建udf函数流程

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

然后创建函数

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

建议大家用这种方式,这种方式你可以随时替换jar,使得函数都是最新的。

这个是创建函数指定用哪个jar

或者

add jar hdfs:///user/hive/function/dw_ce_analysis.jar;

create function defalut.stringcal as 'com.chenchi.s2.function.StringCal';

这个是先加载jar然后根据jar创建函数。 add jar 后list jar可以看到是在/tmp目录

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

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

也可以 

 drop function dwdmdata.stringcal

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

hive创建udf函数流程文章来源地址https://www.toymoban.com/news/detail-487018.html

到了这里,关于hive创建udf函数流程的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • hive引入外部函数-java实现

    https://blog.csdn.net/qq_38783098/article/details/116092731 注意必须要继承GenericUDF 类 原因:这个就是String 转换层 Integer出问题了,主要是initialize方法返回值 是integer值,evaluate必须返回是integer值。

    2024年02月11日
    浏览(21)
  • Hive UDF

    当Hive提供的内置函数不能满足查询需求时,用户可以根据自己业务编写自定义函数(User Defined Functions, UDF), 然后在HiveQL中调用。 例如有这样一个需求:为了保护用户隐私,当查询数据的时候,需要将用户手机号的中间四位用*号代替,比如手机号18001292688需要显示为180****268

    2024年02月22日
    浏览(31)
  • 在ts文件中引入js模块,编写声明文件的方法

     一、声明文件的作用 在ts文件中引入js文件,由于js代码中没有类型约束,所以ts无法获得js代码的类型信息,进而会隐式推断js中类型为any,失去了ts代码类型推断和约束的作用,声明文件就是将一个js模块中所有对外暴露的变量、函数、类使用ts语法进行类型声明,进而让ts编

    2024年02月11日
    浏览(44)
  • hive udf 判断四边形是否为矩形

    hive udf中经常要做判断四边形是否为矩形,所以写了这个udf如下:

    2024年02月12日
    浏览(28)
  • Java实现Hive UDF详细步骤 (Hive 3.x版本,IDEA开发)

    老版本编写UDF时,需要继承 org.apache.hadoop.hive.ql.exec.UDF 类,然后直接实现 evaluate() 方法即可。 由于公司hive版本比较高(3.x),这次编写UDF就采用了新的版本,继承类 org.apache.hadoop.hive.ql.udf.generic.GenericUDF ,实现三个方法 1. 新建项目 打开IDEA,新建一个项目,基本配置如下,A

    2024年02月06日
    浏览(29)
  • starrocks3.0 编写自定义UDF java/scala版本 clickhouse中countResample

    通过自定义UDAF 实现clickhouse中的内置函数 countResample  Java UDF | StarRocks java scala都可以 java可以  scala一直报错类找不到 实际上类在的

    2024年01月25日
    浏览(31)
  • SparkSQL函数定义——UDF函数,窗口函数

    目录 1 定义UDF函数  1.1  返回值是数组类型的UDF定义 1.2 返回字典类型的UDF定义 2 窗口函数 目前python仅支持UDF 两种定义方式: 1. sparksession.udf.register() 注册的UDF可以用于DSL和SQL 返回值用于DSL风格,传参内给的名字用于SQL风格         方法一语法: udf对象 =  sparksession.ud

    2024年02月06日
    浏览(37)
  • spark-udf函数

    from pyspark.sql import SparkSession from pyspark.sql.types import * ss = SparkSession.builder.getOrCreate() df_csv = ss.read.csv(‘hdfs://node1:8020/user/hive/warehouse/data/stu.csv’, schema=‘name string,age int,gender string,phone string,email string,city string,address string’) df_csv.show() def func(email): username = email.split(‘@’)[0] email

    2024年01月22日
    浏览(26)
  • Java创建txt文件并存入内容】—— 使用Java编写代码创建和写入文本文件

    Java创建txt文件并存入内容】—— 使用Java编写代码创建和写入文本文件 文件操作是在软件开发中常见的任务之一。在Java中,你可以使用标准的I/O类来创建和写入文本文件。下面是使用Java编写的示例代码,演示了如何创建一个txt文件并将内容写入其中。 以上代码演示了如何创

    2024年02月05日
    浏览(43)
  • Spark_SQL函数定义(定义UDF函数、使用窗口函数)

                        一、UDF函数定义         (1)函数定义         (2)Spark支持定义函数         (3)定义UDF函数                 (4)定义返回Array类型的UDF         (5)定义返回字典类型的UDF 二、窗口函数         (1)开窗函数简述         (2)

    2024年02月03日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包