hive udtf 函数:输入一个字符串,将这个字符串按照特殊的逻辑处理之后,输出4个字段

server/2024/10/18 14:16:08/

在这里插入图片描述

这里要继承GenericUDTF 这个抽象类,直接上代码:

package com.xxx.hive.udf;
import org.apache.commons.lang.StringUtils;
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.GenericUDTF;
import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector;
import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspectorFactory;
import org.apache.hadoop.hive.serde2.objectinspector.StructObjectInspector;
import org.apache.hadoop.hive.serde2.objectinspector.primitive.PrimitiveObjectInspectorFactory;import java.util.ArrayList;/*** @author xxx* CREATE temporary function  details as 'com.xxx.hive.udf.Details' USING JAR '';*/
@Description(name = "details", value = "_FUNC_(expr) - ")public class Details extends GenericUDTF {@Overridepublic void close() throws HiveException {}@Overridepublic void process(Object[] objects) throws HiveException {if (objects.length == 0 || objects == null) {return;}String input = objects[0].toString();if (StringUtils.isEmpty(input)) {return;}//example dataString details = "0_0_0_0_0~0_0~0_0_0_0_25-1800~0~19~0~19_4800~0~80~0~80_21200~1~0~0~0_20600~1~0~0~0_21100~1~0~0~0;" +"1_1_1_0_9~8_9~9_0_0_27750_24-1800~0~19~0~19_4800~0~80~0~80_21200~1~0~0~0_20600~1~0~0~0_21100~1~0~0~0";String[] lines = input.split(";");for (String line : lines) {String[] arrs = line.split("-");if (arrs.length < 2) {System.out.println("+++++" + input);continue;}String[] header = arrs[0].split("_");String[] steps = arrs[1].split("_");/*BEGIN: 2024-04-02 0~0无法转数字兼容*/try {Integer.valueOf(header[3]);} catch (Exception e) {continue;}/*END: 2024-04-02 0~0无法转数字兼容*/if (header.length > 4 && Integer.valueOf(header[3]) == 2) {continue;}//过滤最后一个字段为空的情况  防止 header[9] 数组越界if (arrs[0].endsWith("_")) {continue;}if (header.length < 10) {continue;}for (int i = 0; i < steps.length; i++) {String[] step = steps[i].split("~");if (step.length < 5) {continue;}Object result = new Object[]{header[1], header[9], step[0], Integer.valueOf(step[4]) - Integer.valueOf(step[3])};forward(result);}}}/*** avoid hitting this exception:  Error in query: No handler for UDF/UDAF/UDTF*/@Overridepublic StructObjectInspector initialize(ObjectInspector[] args) throws UDFArgumentException {if (args.length != 1) {throw new UDFArgumentLengthException("xxx  takes only one argument");}if (args[0].getCategory() != ObjectInspector.Category.PRIMITIVE) {throw new UDFArgumentException("xxx  takes string as a parameter");}ArrayList<String> fieldNames = new ArrayList<String>();ArrayList<ObjectInspector> fieldOIs = new ArrayList<ObjectInspector>();fieldNames.add("moves");fieldOIs.add(PrimitiveObjectInspectorFactory.javaStringObjectInspector);fieldNames.add("left_moves");fieldOIs.add(PrimitiveObjectInspectorFactory.javaStringObjectInspector);fieldNames.add("mubiao");fieldOIs.add(PrimitiveObjectInspectorFactory.javaStringObjectInspector);fieldNames.add("left_num");fieldOIs.add(PrimitiveObjectInspectorFactory.javaIntObjectInspector);return ObjectInspectorFactory.getStandardStructObjectInspector(fieldNames, fieldOIs);}}

http://www.ppmy.cn/server/96405.html

相关文章

树莓派4B学习笔记24:Python_SYN6288语音模块的控制函数

今日继续学习树莓派4B 4G&#xff1a;&#xff08;Raspberry Pi&#xff0c;简称RPi或RasPi&#xff09; 本人所用树莓派4B 装载的系统与版本如下: 版本可用命令 (lsb_release -a) 查询: ​ Opencv 版本是4.5.1&#xff1a; ​ Python 版本3.7.3&#xff1a; 今日学习SYN6288语…

重生之我 学习【数据结构之顺序表(SeqList)】

⭐⭐⭐ 新老博友们&#xff0c;感谢各位的阅读观看 期末考试&假期调整暂时的停更了两个多月 没有写博客为大家分享优质内容 还容各位博友多多的理解 美丽的八月重生之我归来 继续为大家分享内容 你我共同加油 一起努力 ⭐⭐⭐ 数据结构将以顺序表、链表、栈区、队列、二叉树…

Kotlin 委托:深入理解与实际应用

Kotlin 委托:深入理解与实际应用 引言 Kotlin,作为一门现代编程语言,以其简洁、表达性强和类型安全等特点,受到了越来越多开发者的喜爱。在 Kotlin 中,委托是一种强大的语言特性,它允许我们将某些操作委托给另一个对象来处理。这种设计模式不仅提高了代码的可读性和可维…

【弱监督时间动作定位】ACGNet: Action Complement Graph Network for WSTAL 论文阅读

ACGNet: Action Complement Graph Network for Weakly-supervised Temporal Action Localization 论文阅读 AbstractIntroductionRelated WorkAction Complement Graph NetworkMethod OverviewAction Complement GraphGraph InferenceTraining Objective ExperimentsConclusion…

100道C/C++面试题

1. static的作用2. 引用与指针的区别3. .h头文件中的ifndef/define/endif 的作用4 #include<file.h>与#include"file.h"的区别?5 描述实时系统的基本特性6 全局变量和局部变量在内存中是否有区别?如果有&#xff0c;是什么区别?7 什么是平衡二叉树?8 堆栈溢…

CompletableFuture详解

CompletableFuture详解 学习链接:https://juejin.cn/post/7124124854747398175?searchId20240806151438B643DF2AAD2FC5E6F11E 一、CompletableFuture简介 在JAVA8开始引入了全新的CompletableFuture类&#xff0c;它是Future接口的一个实现类。也就是在Future接口的基础上&a…

Python实现深度森林(Deep Forest)回归模型(deepforest回归算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 随着大数据和人工智能技术的发展&#xff0c;机器学习已成为解决各种复杂问题的强大工具。在众多机器学…

springboot+vue+mybatis汽车租赁管理+PPT+论文+讲解+售后

汽车租赁系统是针对目前汽车租赁管理的实际需求&#xff0c;从实际工作出发&#xff0c;对过去的汽车租赁管理系统存在的问题进行分析&#xff0c;完善客户的使用体会。采用计算机系统来管理信息&#xff0c;取代人工管理模式&#xff0c;查询便利&#xff0c;信息准确率高&…