这里写目录标题
- 前言
- 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天前(三亚太阳湾柏悦度假酒店)三亚太阳湾柏悦酒店携手ROSEONLY诺誓缔造浪漫七夕
- 14天前(甘州区文化旅游局)2025甘津文旅资源对接推介会在兰州举办
- 14天前(甘肃文化旅游宣传片)甘肃文旅推介走进重庆
- 14天前(云南南博会展馆)旅居云南馆亮相第9届南博会
- 14天前(花王伴你乐享五一好“趣”处)花王伴你乐享五一好“趣”处
- 14天前(纳米比亚旅游报价)纳米比亚旅游局2024年中国推介会圆满落幕
- 14天前(当科学邂逅喜剧:科技馆喜剧嘉年华背后的"文旅破壁者")当科学邂逅喜剧:科技馆喜剧嘉年华背后的"文旅破壁者"
- 14天前(世茂海峡大厦多高)巴西地产高管齐聚厦门世茂海峡大厦 共探超高层建筑锻造经验
- 14天前(大连aaaaa景区)辽宁大连A级旅游景区应急救护水平整体跃升
- 14天前(新西兰旅游局×时差岛:黄觉的“长白云之乡”奇遇)新西兰旅游局×时差岛:黄觉的“长白云之乡”奇遇
网友评论
- 搜索
- 最新文章
- (2020广州车展哈弗)你的猛龙 独一无二 哈弗猛龙广州车展闪耀登场
- (哈弗新能源suv2019款)智能科技颠覆出行体验 哈弗重塑新能源越野SUV价值认知
- (2021款全新哈弗h5自动四驱报价)新哈弗H5再赴保障之旅,无惧冰雪护航哈弗全民电四驱挑战赛
- (海南航空现况怎样)用一场直播找到市场扩张新渠道,海南航空做对了什么?
- (visa jcb 日本)优惠面面俱到 JCB信用卡邀您畅玩日本冰雪季
- (第三届“堡里有年味·回村过大年”民俗花灯会活动)第三届“堡里有年味·回村过大年”民俗花灯会活动
- (展示非遗魅力 长安启源助力铜梁龙舞出征)展示非遗魅力 长安启源助力铜梁龙舞出征
- (阿斯塔纳航空公司)阿斯塔纳航空机队飞机数量增至50架
- (北京香港航班动态查询)香港快运航空北京大兴新航线今日首航
- (我在港航“呵护”飞机 每一次安全着陆就是最好的荣誉)我在港航“呵护”飞机 每一次安全着陆就是最好的荣誉
- 热门文章