当前位置: 首页 > news >正文

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

这里要继承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.lryc.cn/news/419724.html

相关文章:

  • 【实现100个unity特效之16】unity2022之前或者之后版本实现全屏shader graph的不同方式 —— 适用于人物受伤红屏或者一些其他状态效果
  • 比特币使用ord蚀刻符文---简单笔记
  • 大数据-74 Kafka 高级特性 稳定性 - 控制器、可靠性 副本复制、失效副本、副本滞后 多图一篇详解
  • c# 什么是扩展方法
  • 全屏组件封装(react18+antd)
  • wordpress全局自适应网址导航整站打包源码,含主题和数据库
  • PyTorch深度学习框架
  • Python和AI库NumPy(二):数组创建与操作
  • GD32 SPI驱动代码
  • Qgis 开发初级 《数据库和图层》
  • 三大机器学习框架对比:TensorFlow、PyTorch与Scikit-Learn
  • Apache OFBiz 曝出严重漏洞,允许预身份验证 RCE
  • SpringCloud 微服务nacos和eureka
  • Java学习篇(一)| 如何生成分布式全局唯一ID
  • c++ 弹窗办法
  • 小程序使用this.animate实现3维动画切换
  • 【区块链+社会公益】第一反应互助急救链 | FISCO BCOS应用案例
  • leetcode 136. 只出现一次的数字
  • 可扩展架构设计:策略与最佳实践
  • 一图胜千言|图解Pandas常用操作!
  • ue5正确导入资源 content(内容),content只能有一个
  • HTTP协议基础知识【后端 4】
  • 2024/8/10 英语每日一段
  • 深入探索 Wireshark——网络封包分析的利器
  • VS2022使用.Net Framework4.0方法
  • 创建一个简单的贪吃蛇游戏:HTML、CSS和JavaScript教程
  • 全面讲解电子齿轮比与脉冲数计算
  • 音频进阶学习一——模拟信号和数字信号
  • SpringBoot企业人事管理系统-附源码与配套论文
  • 用window计算器实现定点数的十进制和二进制之间相互转换