这里写目录标题
- 前言
- 1. 新建项目
- 2.配置maven依赖
- 3.编写代码
- 4.打jar包
- 5.上传服务器
- 6.代码中引用
前言
老版本编写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需要用到的依赖
org.apache.hive hive-exec 3.1.2 org.apache.commons commons-compress org.apache.maven.plugins maven-compiler-plugin 8 8 3.编写代码
目录结构可自行定义,这块不影响实际功能,代码整体框架如下
我这里代码传入三列数据,返回一列数据,入参可以判断一下是否传入数据正确,以及数据类型是否匹配
主要实现三个方法,具体内容在代码块中有说明
- initialize
- evaluate
- getDisplayString
public class ComputeUnitPrice extends GenericUDF { WritableHiveDecimalObjectInspector decimalObjectInspector; //初始化方法,做一些检查 @Override public ObjectInspector initialize(ObjectInspector[] arguments) throws UDFArgumentException { // 判断输入参数的个数 if(arguments.length !=3){ throw new UDFArgumentLengthException("This UDF Only takes 3 arguments: String, String, Decimal"); } ObjectInspector param1 = arguments[0]; ObjectInspector param2 = arguments[1]; ObjectInspector param3 = arguments[2]; // 判断输入参数的类型 if(!(param1 instanceof StringObjectInspector)){ throw new UDFArgumentException("Param1 Type is error,Must be : String"); } if(!(param2 instanceof StringObjectInspector)){ throw new UDFArgumentException("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类型的鉴别器对象 return PrimitiveObjectInspectorFactory.javaHiveDecimalObjectInspector; } } @Override public Object evaluate(DeferredObject[] arguments) throws HiveException { //计算逻辑编写 } //udf的说明 @Override public String getDisplayString(String[] children) { return "ComputeUnitPrice"; } //main方法测试一下数据结果 public static void main(String[] args) throws HiveException { ComputeUnitPrice computeUnitPrice = new ComputeUnitPrice(); DeferredObject[] param = {new DeferredJavaObject("箱"), new DeferredJavaObject("800g*8袋/箱"), new DeferredJavaObject(100.20)}; JavaDoubleObjectInspector javaDoubleObjectInspector = PrimitiveObjectInspectorFactory.javaDoubleObjectInspector; ObjectInspector stringOi = PrimitiveObjectInspectorFactory.javaStringObjectInspector; ObjectInspector doubleOi = PrimitiveObjectInspectorFactory.javaDoubleObjectInspector; computeUnitPrice.initialize(new ObjectInspector[]{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; create temporary function compute_sku_unit_price as 'xx.xxx.xxx.xxx.ComputeUnitPrice'; ${your_sql};
猜你喜欢
- 14天前(大理悦云雅阁酒店电话)雅阁酒店集团|端午佳节礼遇,大理悦云雅阁度假酒店
- 14天前(四川推进世界重要旅游目的地建设工作)四川推进世界重要旅游目的地建设
- 14天前(福朋喜来登酒店宴会厅)福朋喜来登品牌亮相北部湾城市群 阳江中心福朋喜来登酒店开业
- 14天前(屿见不一样是哪个酒店)屿见白纱,遇见自己 “佳能PhotoGirls屿见白纱”摄影派对玩转海岛
- 14天前(曼谷丽思卡尔顿公寓价格)在曼谷丽思卡尔顿酒店CALEŌ 邂逅鸡尾酒的浪漫艺术
- 14天前(马尔代夫华尔道夫酒店多少钱)Chef Zhao就任马尔代夫伊挞富士岛华尔道夫酒店Li Long中餐厅新主厨
- 14天前(星级饭店的发展困境)星级饭店转型之路:从市场逻辑到行业实践的深度探索
- 14天前(2025年安徽省“百场黄梅唱响百家景区”示范展示启动)2025年安徽省“百场黄梅唱响百家景区”示范展示启动
- 14天前(大连aaaaa景区)辽宁大连A级旅游景区应急救护水平整体跃升
- 14天前(海南航空现况怎样)用一场直播找到市场扩张新渠道,海南航空做对了什么?
网友评论
- 搜索
- 最新文章
- (2020广州车展哈弗)你的猛龙 独一无二 哈弗猛龙广州车展闪耀登场
- (哈弗新能源suv2019款)智能科技颠覆出行体验 哈弗重塑新能源越野SUV价值认知
- (2021款全新哈弗h5自动四驱报价)新哈弗H5再赴保障之旅,无惧冰雪护航哈弗全民电四驱挑战赛
- (海南航空现况怎样)用一场直播找到市场扩张新渠道,海南航空做对了什么?
- (visa jcb 日本)优惠面面俱到 JCB信用卡邀您畅玩日本冰雪季
- (第三届“堡里有年味·回村过大年”民俗花灯会活动)第三届“堡里有年味·回村过大年”民俗花灯会活动
- (展示非遗魅力 长安启源助力铜梁龙舞出征)展示非遗魅力 长安启源助力铜梁龙舞出征
- (阿斯塔纳航空公司)阿斯塔纳航空机队飞机数量增至50架
- (北京香港航班动态查询)香港快运航空北京大兴新航线今日首航
- (我在港航“呵护”飞机 每一次安全着陆就是最好的荣誉)我在港航“呵护”飞机 每一次安全着陆就是最好的荣誉
- 热门文章