0


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,新建一个项目,基本配置如下,Archetype选择图中所示
在这里插入图片描述

2.配置maven依赖

导入编写UDF需要用到的依赖

<dependencies><!-- https://mvnrepository.com/artifact/org.apache.hive/hive-exec --><dependency><groupId>org.apache.hive</groupId><artifactId>hive-exec</artifactId><version>3.1.2</version><exclusions><exclusion><groupId>org.apache.commons</groupId><artifactId>commons-compress</artifactId></exclusion></exclusions></dependency><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><configuration><source>8</source><target>8</target></configuration></plugin></plugins></build>

3.编写代码

目录结构可自行定义,这块不影响实际功能,代码整体框架如下
我这里代码传入三列数据,返回一列数据,入参可以判断一下是否传入数据正确,以及数据类型是否匹配
主要实现三个方法,具体内容在代码块中有说明

  1. initialize
  2. evaluate
  3. getDisplayString
publicclassComputeUnitPriceextendsGenericUDF{WritableHiveDecimalObjectInspector  decimalObjectInspector;//初始化方法,做一些检查@OverridepublicObjectInspectorinitialize(ObjectInspector[] arguments)throwsUDFArgumentException{// 判断输入参数的个数if(arguments.length !=3){thrownewUDFArgumentLengthException("This UDF Only takes 3 arguments: String, String, Decimal");}ObjectInspector param1 = arguments[0];ObjectInspector param2 = arguments[1];ObjectInspector param3 = arguments[2];// 判断输入参数的类型if(!(param1 instanceofStringObjectInspector)){thrownewUDFArgumentException("Param1 Type is error,Must be : String");}if(!(param2 instanceofStringObjectInspector)){thrownewUDFArgumentException("Param2 Type is error,Must be : String");}//        if(!(param3 instanceof JavaConstantHiveDecimalObjectInspector)){//            throw new UDFArgumentException("Param3 Type is error,Must be : JavaHiveDecimal");//        }this.decimalObjectInspector =(WritableHiveDecimalObjectInspector) param3;//函数返回值为 Decimal,需要返回 Decimal类型的鉴别器对象returnPrimitiveObjectInspectorFactory.javaHiveDecimalObjectInspector;}}@OverridepublicObjectevaluate(DeferredObject[] arguments)throwsHiveException{//计算逻辑编写}//udf的说明@OverridepublicStringgetDisplayString(String[] children){return"ComputeUnitPrice";}//main方法测试一下数据结果publicstaticvoidmain(String[] args)throwsHiveException{ComputeUnitPrice computeUnitPrice =newComputeUnitPrice();DeferredObject[] param ={newDeferredJavaObject("箱"),newDeferredJavaObject("800g*8袋/箱"),newDeferredJavaObject(100.20)};JavaDoubleObjectInspector javaDoubleObjectInspector =PrimitiveObjectInspectorFactory.javaDoubleObjectInspector;ObjectInspector stringOi =PrimitiveObjectInspectorFactory.javaStringObjectInspector;ObjectInspector doubleOi =PrimitiveObjectInspectorFactory.javaDoubleObjectInspector;
        computeUnitPrice.initialize(newObjectInspector[]{stringOi, stringOi,doubleOi});double res =  javaDoubleObjectInspector.get(computeUnitPrice.evaluate(param));System.out.println("res "+ res);}

4.打jar包

将项目打成jar包

mvn clean package

执行完成,target目录下寻找自己的jar包

5.上传服务器

本地上传到机器,再由机器上传到hdfs或者s3等

6.代码中引用

add jars xxxxx/compute_sku_unit_price.jar;createtemporaryfunction compute_sku_unit_price as'xx.xxx.xxx.xxx.ComputeUnitPrice';
${your_sql};
标签: java hive intellij-idea

本文转载自: https://blog.csdn.net/qq_40309183/article/details/134165071
版权归原作者 Called_Kingsley 所有, 如有侵权,请联系我们删除。

“Java实现Hive UDF详细步骤 (Hive 3.x版本,IDEA开发)”的评论:

还没有评论