Hive中自定义UDF,UDTF实例以及三种自定义函数的区别

2023-11-01

Hive中有三种UDF:

分类

1、用户定义函数(user-defined function)UDF;
2、用户定义聚集函数(user-defined aggregate function,UDAF);
3、用户定义表生成函数(user-defined table-generating function,UDTF)。

介绍

UDF操作作用于单个数据行,并且产生一个数据行作为输出。大多数函数都属于这一类(比如数学函数和字符串函数)。
UDAF 接受多个输入数据行,并产生一个输出数据行。像COUNT和MAX这样的函数就是聚集函数。
UDTF 操作作用于单个数据行,并且产生多个数据行-------一个表作为输出。lateral view explore()

简单来说:

UDF:返回对应值,一对一
UDAF:返回聚类值,多对一
UDTF:返回拆分值,一对多

自定义UDF过程以及例子

自定义UDF过程

导入hive 自定义jar包
继承UDF借口
实现evaluate方法

临时函数的使用:

进入hive的交互shell中
1. 上传自定义udf的jar
hive> add jar /path/to/lower.jar
2. 创建临时函数
hive> create temporary function xxoo_lower as 'test.ql.LowerUDF';
3. 验证
hive> select xxoo_lower("Hello World!");

永久函数的使用:

1. 把自定义函数的jar上传到hdfs中.
hdfs dfs -put lower.jar 'hdfs:///path/to/hive_func';
2. 创建永久函数
hive> create function xxoo_lower as 'test.ql.LowerUDF' using jar 'hdfs:///path/to/hive_func/lower.jar'
3. 验证
hive> select xxoo_lower("Hello World");
hive> show functions;

需求:

ip格式转换 -192.168.2.1  -> 192.168.002.001
import org.apache.hadoop.hive.ql.exec.UDF;

/**
 * 自定义hive  UDF函数
 *   hive:2.3.2
 *      打包完成可能报错
 *      linux下执行命令:
 *      zip -d yourjar.jar 'META-INF/.SF' 'META-INF/.RSA' 'META-INF/*SF'
 */
public class MyUDF extends UDF {

    //ip   192.168.2.1  192.168.002.001
    /**
     * ip_location:ip地址库表  起始ip 终止ip 所属国家 所属省份 所属市
     * log:ip
     */
    public String evaluate(String ip){
        String[] datas = ip.split("\\.");//按.切分转义
        StringBuffer sb = new StringBuffer();
        //前边补三个0
        for(String s:datas){
            s="000"+s;
            s=s.substring(s.length()-3);
            sb.append(s).append(".");
        }
        return sb.substring(0,sb.length()-1);
    }

    /*//本地测试
    public static void main(String[] args) {
        String evaluate = evaluate("2.3.5.3");
        System.out.println(evaluate);
    }*/
}

其他例子

自定义UDTF过程以及例子

编程套路:

  • 继承org.apache.hadoop.hive.ql.udf.generic.GenericUDTF,实现initialize, process, close三个方法。

  • UDTF首先会调用initialize方法,此方法返回UDTF的返回行的信息加粗样式(返回个数,类型)。

  • 初始化完成后,会调用process方法,真正的处理过程在process函数中,在process中,每一次forward()调用产生一行;如果产生多列可以将多个列的值放在一个数组中,然后将该数组传入到forward()函数。

  • 最后close()方法调用,对需要清理的方法进行清理。

需求:
切分”key:value;key:value;”这种字符串,返回结果为key, value两个字段

import java.util.ArrayList;

 import org.apache.hadoop.hive.ql.udf.generic.GenericUDTF;
 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.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;

 public class ExplodeMap extends GenericUDTF{

     @Override
     public void close() throws HiveException {
     }

     @Override
     public StructObjectInspector initialize(ObjectInspector[] args)
             throws UDFArgumentException {
         if (args.length != 1) {
             throw new UDFArgumentLengthException("ExplodeMap takes only one argument");
         }
         if (args[0].getCategory() != ObjectInspector.Category.PRIMITIVE) {
             throw new UDFArgumentException("ExplodeMap takes string as a parameter");
         }

         ArrayList<String> fieldNames = new ArrayList<String>();
         ArrayList<ObjectInspector> fieldOIs = new ArrayList<ObjectInspector>();
         fieldNames.add("col1");
         fieldOIs.add(PrimitiveObjectInspectorFactory.javaStringObjectInspector);
         fieldNames.add("col2");
         fieldOIs.add(PrimitiveObjectInspectorFactory.javaStringObjectInspector);

         return ObjectInspectorFactory.getStandardStructObjectInspector(fieldNames,fieldOIs);
     }

     @Override
     public void process(Object[] args) throws HiveException {
         String input = args[0].toString();
         String[] test = input.split(";");
         for(int i=0; i<test.length; i++) {
             try {
                 String[] result = test[i].split(":");
                 forward(result);
             } catch (Exception e) {
                 continue;
             }
         }
     }
 }

使用方式
UDTF有两种使用方法,一种直接放到select后面,一种和lateral view一起使用

1:直接select中使用

select explode_map(properties) as (col1,col2) from src;

2:和lateral view一起使用

select src.id, mytable.col1, mytable.col2 from src lateral view explode_map(properties) mytable as col1, col2;

此方法更为方便日常使用。执行过程相当于单独执行了两次抽取,然后union到一个表里。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Hive中自定义UDF,UDTF实例以及三种自定义函数的区别 的相关文章

  • 大数据专业到底有多火?

    2017 2018大数据为什么这么火热 从以下方面来看 人民日报官方微信公众平台发布了一篇文章 公布已有35所高校获批 数据科学与大数据技术 专业 使大数据受到更多家长的关注 大数据也被越来越多的人重视 高校开办相关专业也不能缓解大数据人才
  • 零基础30岁转行大数据行业,可行吗?

    一 大数据是否值得投入 我们先来讨论下大数据是不是值得大家从事的一项职业 如下问题 大数据为啥这么有诱惑力 是否值得投入 现在进去晚了吗 首先 大数据企业众多 逐步形成产业化 从08年开始 大数据就成为互联网信息领域的大热门 由此而来 大数
  • 零基础学习大数据经验分享

    大数据人才极度匮乏 无论是互联网巨头企业 还是中小型企业 创业公司都非常缺乏大数据专业人才 在数据驱动的未来 大数据人才市场势必会越来越大 而现在仅仅是大数据起步的进阶阶段 可以想象未来的人才缺口有多大 所以现在入行正是恰逢其时 市场需求的
  • Idea工具的使用

    文章目录 一 IDEA的使用 二 IDEA工具的快捷键以及一些简单的设置 1 字体设置 2 快速生成main方法 psvm 3 快速生成System out println sout 4 注意 IEDA是自动保存 不需要ctrl s 5 删
  • 大数据开发需要哪些工具?大数据开发必备工具汇总

    大数据研究的出现 为企业 研究机构 政府决策提供了新的行之有效思路和手段 想要做好大数据的管理和分析 一些大数据开发工具的使用是必不可少的 以下是大数据开发过程中常用的工具 1 Apache Hive Hive是一个建立在Hadoop上的开
  • Hive中自定义UDF,UDTF实例以及三种自定义函数的区别

    Hive中有三种UDF 分类 1 用户定义函数 user defined function UDF 2 用户定义聚集函数 user defined aggregate function UDAF 3 用户定义表生成函数 user defin
  • Kafka源码阅读

    工程版本与工程建立 kafaka 使用scalar java 语言编写 kafaka 源码阅读版本 kafka 0 10 1 1 工程建立 1 安装 JDK8 2 安装 gradle 3 0 3 下载安装IDEA 社区版 免费 4 用IDE
  • 大数据学习 第一篇——基础知识

    前言 在学习大数据之前 先要了解他解决了什么问题 能给我们带来什么价值 一方面 以前IT行业发展没有那么快 系统的应用也不完善 数据库足够支撑业务系统 但是随着行业的发展 系统运行的时间越来越长 搜集到的数据也越来越多 传统的数据库已经不能
  • 大数据和人工智能的关系,超全解析

    大数据拥抱云计算 在PaaS层中一个复杂的通用应用就是大数据平台 大数据是如何一步一步融入云计算的呢 1数据不大也包含智慧 一开始这个大数据并不大 原来才有多少数据 现在大家都去看电子书 上网看新闻了 在我们80后小时候 信息量没有那么大
  • MySQL 安装指南

    本教程教你如何在基于 Ubuntu 的 Linux 发行版上安装 MySQL 对于首次使用的用户 你将会学习到如何验证你的安装和第一次怎样去连接 MySQL Sergiu MySQL 是一个典型的数据库管理系统 它被用于许多技术栈中 包括流
  • 从工具了解大数据之Kettle

    最近沉迷Python爬虫学习 很有意思 即时刹车 坚持一步一学习 一步一整理 Kettle目前工作用于数据库搬运 例如Oracle定时搬运到mysql中间表 以便于加速查询 1 相关学习资料 尚硅谷 大数据技术之Kettle视频教程 网盘资
  • 一起学大数据|最详细的大数据学习资源教程,呕心沥血全部分享

    跟大家已经分享了这么长时间的大数据文章了 我们的一起来学大数据系列已经将Java和Linux全部做了一次基础的分享 今天 我把我整理的全套大数据资源分享给大家 一起共同学习 记得关注呦 很多初学者 对大数据的概念都是模糊不清的 大数据是什么
  • 最详细的Spark内存管理

    spark 各版本的内存参数 一 Spark 1 6内存管理 spark 1 6之前 使用StaticMemoryManager 叫legacy模式 默认是关闭的 spark1 6开始 使用UnifiedMemoryManager 1 6开
  • 尚硅谷大数据技术之Flume

    第1章 概述 1 1 Flume定义 Flume是Cloudera提供的一个高可用的 高可靠的 分布式的海量日志采集 聚合和传输的系统 Flume基于流式架构 灵活简单 flume能保证数据的可靠性 但不能保证数据的重复性 1 2 Flum
  • 使用python的pandas包查询数据库数据导出到excel

    文章目录 前言 1 实现分析 2 实现过程 2 1安装环境 2 3功能逻辑 2 4完整代码 3 总结 前言 前几天接到一个业务的需求 让我把当前数据库里面的结果数据导出到excel中 然后供业务查看 问题是当前结果数据都是列式表 所以需要把
  • 大数据学习——2PC算法

    分布式下数据一致性问题 对于一个将数据副本分布在不同得分布式下的系统来说 如果对一个节点的数据进行更新 但是其他节点的数据却没有进行相应的更新 于是在读取其他节点的数据时 便不是最新的数据 即脏数据 这就是典型的数据不一直问题 为解决这个问
  • 大数据好不好学,有这几大步骤你就懂了

    很多初学者在萌生向大数据方向发展的想法之后 不免产生一些疑问 应该怎样入门 应该学习哪些技术 学习路线又是什么 所有萌生入行的想法与想要学习Java的同学的初衷是一样的 岗位非常火 就业薪资比较高 前景非常可观 基本都是这个原因而向往大数据
  • 文科生转行数据分析,分享我的大数据培训经历

    以下文章转载自一位培训数据分析小伙伴的分享 对于很多想转行学习大数据技术 参加大数据培训的小伙伴们 可以参考参考 很多人不敢承认自己是培训出来的 我今天来简单讲讲我参加数据分析培训的经理 大家有什么疑问的可以留言交流 我目前在四川一家大型移
  • 大数据学习路线

    希望可以把这篇文章推广给所有想学习或者想从事数据科学方向的朋友 我作为偏统计方向的分析师也在这里说一下自己的一些学习方向和方法 希望对大家有帮助 推荐一个大数据学习群 142973723每天晚上20 10都有一节 免费的 大数据直播课程 专
  • 大数据、数据分析和数据挖掘的区别

    大数据 数据分析 数据挖掘的区别是 大数据是互联网的海量数据挖掘 而数据挖掘更多是针对内部企业行业小众化的数据挖掘 数据分析就是进行做出针对性的分析和诊断 大数据需要分析的是趋势和发展 数据挖掘主要发现的是问题和诊断 1 大数据 big d

随机推荐

  • oracle数据库与postgre数据库之间的互相迁移

    oracle与postgre之间互相迁移之前要明白 postgreSQL中默认使用小写 oracleSQL中默认大写 迁移分成3个步骤 数据及结构迁移 迁移之后的类型及长度变化 不兼容的函数替换 1 数据及结构迁移 1 1数据大小写同步 o
  • JS 判断对象中是否包含某属性

    一 通过点或者方括号 我们在使用对象的时候 通过点或方括号可以获取对象的属性值 如果该对象自身不存在这个属性 就会返回undefined var obj name 小破船 doWhat 借箭 console log obj name 小破船
  • css linear-gradient 设置背景颜色渐变

    CSS3 渐变能够让背景颜色在两个或多个颜色之间平滑过渡 基本语法 background linear gradient direction color stop1 color stop2 direction 是指渐变的方向 color s
  • 迷宫问题寻宝(c++实现,求最短路径,显示路径)

    定义一个二维数组 int maze n m 它表示一个迷宫 其中的1表示道路不通 0表示可以走的路 3 表示宝藏 只能横着走或竖着走 不能斜着走 要求编程序找出找到宝藏的最短路路径 题目保证有解且只有一个最短路径 且只能从迷宫边缘进入迷宫
  • tomcat中仅启动指定的项目,不启动其它项目

    使用tomcat调试项目时 若部署过多项目会导致启动时间很长 这时指定自己想启动的项目就显得很有必要了 具体方法如下 一 打开tomcat中的server xml配置文件 在Host节点中添加或修改如下属性 deployXML false
  • QT系列第3节 QT中混合UI设计

    QT开发过程中 经常使用Qt designer设计器和代码方式结合来及进行ui设计 本节将介绍这两种方式混合进行ui开发 目录 1 工程添加图片资源 2 添加菜单 3 添加工具栏 4 简单文本编辑器实现 5 QT Creator常用快捷键
  • scrapy设置代理ip(精简版)

    在middlewares py文件中 添加下面的代码 import scrapy from scrapy import signals import random class ProxyMiddleware object def proce
  • 爬取淘宝价格

    爬取淘宝价格 from selenium import webdriver from lxml import etree from time import sleep 实例化一个浏览器对象 bro webdriver Chrome exec
  • [调用函数]

    注 梳理 整理 用来帮助自己学习 如有错误 请指出 1 编写一个函数 该函数接受两个整数作为参数并返回它们的和 在主函数中调用该函数并输出结果 示例输入 5 7 示例输出 12 解题思路 首先需要定义一个函数来实现两个整数的加法 函数的返回
  • 对于进程同步和异步的理解

    多进程并发执行具有异步的特性 进程异步就是指一个以上的进程在并发执行时具有的异步特型 就比如说两个进程之间指令的执行顺序是不确定的 具有很强的随机性 举个例子 现在有两个并发执行的进程 A 和 B 各自都有n条指令需要执行 然而 我的CPU
  • python后端学习(七)HTTP协议、实现WEB服务器

    HTTP协议简介 浏览器 gt 服务器发送的请求格式如下 GET HTTP 1 1 请求方式 路径 协议及版本 Host 127 0 0 1 8080 请求的地址 Connection keep alive 长连接 Accept text
  • RS485模块的介绍及引脚连线说明

    RS485模块通讯 1 RS 485简介 2 SP3485芯片及应用 1 RS 485简介 RS 485采用平衡发送和差分接收 因此具有抑制共模干扰的能力 以下是某宝上RS485模块的截图 应用特点 传输数据速度快 高达10Mbps 即10
  • 【老生谈算法】matlab实现粒子滤波及实现

    粒子滤波及matlab实现 1 文档下载 本算法已经整理成文档如下 有需要的朋友可以点击进行下载 说明 文档 点击下载 本算法文档 老生谈算法 matlab实现粒子滤波及实现 doc 更多matlab算法原理及源码详解可点击下方文字直达 5
  • 《Apache MINA 2.0 用户指南》第六章:传输

    最近准备将Apache MINA 2 0 用户指南英文文档翻译给大家 但是我偶然一次百度 发现 Defonds 这位大牛已经翻译大部分文档 原文链接 http mina apache org mina project userguide c
  • 从单向链表中删除指定值的节点-牛客网

    题目描述 输入一个单向链表和一个节点的值 从单向链表中删除等于该值的节点 删除后如果链表中无节点则返回空指针 链表结点定义如下 struct ListNode int m nKey ListNode m pNext 详细描述 本题为考察链表
  • 电脑知识【自用】

    1 解决BIOS误删Windows Boot Manager 方法一 通过Grub进行修复 通过以下步骤解决 重启电脑 按F12进入BIOS SETUP 进入Boot Sequence 查看Windows Boot Manager是否丢失
  • Sftp实现文件的上传下载(com.jcraft.jsch依赖解决解决:Could not parse response code.Server Reply: SSH-2.0-OpenSSH_5.3)

    依赖如下
  • 给vcenter中的Esxi主机网络添加VLAN

    1 使用vSphere Client连接到VMware ESXi Server 在 配置 网络 中 可以看到 当前有两个虚拟交换机 并且为该虚拟交换机分配了管理地址10 10 228 81 点击 添加网络 如图所示 2 添加配置向导 在网络
  • 圆检测学习笔记

    目录 边缘检测 再检测圆 霍夫圆检测 转自 深度OpenCV开发之精准找圆 GitHub zikai1 CircleDetection circle detection inscribed triangles image processin
  • Hive中自定义UDF,UDTF实例以及三种自定义函数的区别

    Hive中有三种UDF 分类 1 用户定义函数 user defined function UDF 2 用户定义聚集函数 user defined aggregate function UDAF 3 用户定义表生成函数 user defin