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

HIVE自定义UDTF函数

UDTF函数

文章目录

    • UDTF函数
      • 一、继承GenericUDTF类
        • initialize方法
        • process方法
        • close方法
      • 二、源码解析
      • 三、例子

HIVE提供了丰富的内置函数,但是对于一些复杂逻辑还是需要自定义函数来实现,对此,HIVE也提供了一些自定义的接口和类。
UDF:一进一出,一对一的关系数据
UDTF:一进多处,一对多的关系数据
UDAF:多进一出,多对一的关系数据

一、继承GenericUDTF类

实现三个方法:

initialize方法

两个作用:

  1. 初始化参数,判断参数类型是否符合要求

  2. 设置输出列和类型

    ArrayList<String> fieldNames = new ArrayList<String>();
    ArrayList<ObjectInspector> fieldOIs = new ArrayList<ObjectInspector>();
    
    fieldNames.add("col1");  // 列名为col1
    fieldOIs.add(PrimitiveObjectInspectorFactory.javaStringObjectInspector);  // 类型String
    fieldNames.add("col2");
    fieldOIs.add(PrimitiveObjectInspectorFactory.javaStringObjectInspector);
    

process方法

处理数据,通过forward方法将数据写出,没写出一次,代表为一行,可以传入一个数组

forward(result);

close方法

顾名思义,打扫干净,下一位

二、源码解析

因为在之前的版本UDTF的initialize方法提供的是:

@Override
public StructObjectInspector initialize(ObjectInspector[] argOIs) throws UDFArgumentException {
  return super.initialize(argOIs);
}

现在上述的方式已经不推荐了,改作了:

@Override
public StructObjectInspector initialize(StructObjectInspector argOIs) throws UDFArgumentException {

return super.initialize(argOIs);
}

将一个参数数组转变为了一个结构对象检查器,这个怎么使用的?

看一下super的实现:

public StructObjectInspector initialize(StructObjectInspector argOIs)
      throws UDFArgumentException {
  List<? extends StructField> inputFields = argOIs.getAllStructFieldRefs();
  ObjectInspector[] udtfInputOIs = new ObjectInspector[inputFields.size()];
  for (int i = 0; i < inputFields.size(); i++) {
    udtfInputOIs[i] = inputFields.get(i).getFieldObjectInspector();
  }
  return initialize(udtfInputOIs);
}

如果需要校验参数类型,通过size方法校验长度,通过getTypeName方法校验类型

//对输入参数个数进行进行检验
if (argOIs.getAllStructFieldRefs().size()!=1) {
        throw new UDFArgumentException ("args must be 1");
    }
//对输入参数的类型校验
    if(!"string".equals(argOIs.getAllStructFieldRefs().get(0).getFieldObjectInspector().getTypeName().toLower())){
        throw new  UDFArgumentException("args type must be string");
     }

其实就是将参数列表封装成了StructObjectInspector对象,如果想要校验参数,那么通过上述的方式,可以看到,调用getAllStructFieldRefs方法,获取所有的输入列列表,遍历就可以取到参数列表了

inputFields.get(i).getFieldObjectInspector();

process方法就是处理逻辑的方法,每次输出一个forward,就会分割为一列

String[] result = comment.split(":");
forward(result);

三、例子

按照逗号进行分割字符串,输出列

public class ExplodeArray extends GenericUDTF {
    public StructObjectInspector initialize(StructObjectInspector argOIs) throws UDFArgumentException {
        //定义返回值名称
        List<String> filedNames = new ArrayList<String>();
        //校验返回值类型
        List<ObjectInspector> filedOIs= new ArrayList<ObjectInspector>();
        filedNames.add("col1");
           filedOIs.add(PrimitiveObjectInspectorFactory.javaStringObjectInspector);
        return  ObjectInspectorFactory.getStandardStructObjectInspector(filedNames,filedOIs);
    }

    public void process(Object[] objects) throws HiveException {
        String comment= objects[0].toString();
        String[] str = comment.split(",");
		for(String s : str){
		    forward(s);
		}
    }

    public void close() throws HiveException {

    }
}

注意在UDTF函数中,会出现传入数据异常的问题,在这里我并没有校验参数,在实际生产中是需要校验参数的。

相关文章:

  • 脑机接口002 | 上海与长三角地区脑科学发展与跨学科合作
  • 常用的Linux命令
  • C++ 【模板和string模拟实现】
  • C语言拍品管理系统
  • 计算机毕业设计ssm社区流浪动物救助系统2r32k系统+程序+源码+lw+远程部署
  • 性能调优,看过的都说会了...
  • 基于springboot的通知反馈系统
  • pytorch 多GPU训练总结(DataParallel的使用)
  • 写文章的软件-免费写文章的软件
  • vue 不相干的两个页面相互通信方式
  • 流式编程 stream
  • FPGA刷题——数据位宽转换(整数倍非整数倍)
  • 自动控制原理7.2---信号的采样与保持
  • 深挖全媒体多模态数据价值,蜜度亮相2022世界人工智能大会
  • Qt开发及建立工程
  • Angularjs之国际化
  • echarts的各种常用效果展示
  • Fastjson的基本使用方法大全
  • Fundebug计费标准解释:事件数是如何定义的?
  • gops —— Go 程序诊断分析工具
  • idea + plantuml 画流程图
  • JavaScript的使用你知道几种?(上)
  • Node项目之评分系统(二)- 数据库设计
  • PAT A1092
  • SSH 免密登录
  • Terraform入门 - 3. 变更基础设施
  • win10下安装mysql5.7
  • 阿里云应用高可用服务公测发布
  • 第三十一到第三十三天:我是精明的小卖家(一)
  • 简单实现一个textarea自适应高度
  • 如何使用 JavaScript 解析 URL
  • 如何使用Mybatis第三方插件--PageHelper实现分页操作
  • 如何正确配置 Ubuntu 14.04 服务器?
  • 使用common-codec进行md5加密
  • 使用Envoy 作Sidecar Proxy的微服务模式-4.Prometheus的指标收集
  • 树莓派 - 使用须知
  • 栈实现走出迷宫(C++)
  • Android开发者必备:推荐一款助力开发的开源APP
  • ​用户画像从0到100的构建思路
  • #if和#ifdef区别
  • #常见电池型号介绍 常见电池尺寸是多少【详解】
  • #我与Java虚拟机的故事#连载19:等我技术变强了,我会去看你的 ​
  • (07)Hive——窗口函数详解
  • (3)(3.2) MAVLink2数据包签名(安全)
  • (八)Docker网络跨主机通讯vxlan和vlan
  • (附源码)springboot炼糖厂地磅全自动控制系统 毕业设计 341357
  • (附源码)ssm高校志愿者服务系统 毕业设计 011648
  • (附源码)ssm考生评分系统 毕业设计 071114
  • (附源码)计算机毕业设计SSM疫情社区管理系统
  • (论文阅读30/100)Convolutional Pose Machines
  • (牛客腾讯思维编程题)编码编码分组打印下标题目分析
  • (三)Hyperledger Fabric 1.1安装部署-chaincode测试
  • (一)80c52学习之旅-起始篇
  • (一)插入排序
  • (一)使用Mybatis实现在student数据库中插入一个学生信息