Hive UDF开发

news2024/9/22 19:45:11

Hive中,除了提供丰富的内置函数(见Hive函数大全–完整版(二))之外,还允许用户使用Java开发自定义的UDF函数。

开发自定义UDF函数有两种方式,一个是继承org.apache.hadoop.hive.ql.exec.UDF,另一个是继承org.apache.hadoop.hive.ql.udf.generic.GenericUDF;

如果是针对简单的数据类型(比如String、Integer等)可以使用UDF,如果是针对复杂的数据类型(比如Array、Map、Struct等),可以使用GenericUDF,另外,GenericUDF还可以在函数开始之前和结束之后做一些初始化和关闭的处理操作。

UDF

使用UDF非常简单,只需要继承org.apache.hadoop.hive.ql.exec.UDF,并定义

public Object evaluate(Object args) {} 方法即可。

比如,下面的UDF函数实现了对一个String类型的字符串取HashMD5:

package net.csdn.hive.udf;

import org.apache.hadoop.hbase.util.Bytes;
import org.apache.hadoop.hbase.util.MD5Hash;
import org.apache.hadoop.hive.ql.exec.UDF;

public class HashMd5 extends UDF {
public String evaluate(String cookie) {
return MD5Hash.getMD5AsHex(Bytes.toBytes(cookie));
}
}

将上面的HashMd5类打成jar包,udf.jar

使用时候,在Hive命令行执行:

hdfs dfs -put -f udf.jar  hdfs://xxxxx/user/hive/jars/
CREATE function str_md5 as 'net.csdn.hive.udf.HashMd5' using jar 'hdfs://xxxxx/user/hive/jars/udf.jar';;
select str_md5(‘test.com’) from dual;

GenericUDF

继承org.apache.hadoop.hive.ql.udf.generic.GenericUDF之后,需要重写几个重要的方法:

public void configure(MapredContext context) {}

//可选,该方法中可以通过context.getJobConf()获取job执行时候的Configuration;

//可以通过Configuration传递参数值

public ObjectInspector initialize(ObjectInspector[] arguments)

//必选,该方法用于函数初始化操作,并定义函数的返回值类型;

//比如,在该方法中可以初始化对象实例,初始化数据库链接,初始化读取文件等;

public Object evaluate(DeferredObject[] args){}

//必选,函数处理的核心方法,用途和UDF中的evaluate一样;

public String getDisplayString(String[] children)

//必选,显示函数的帮助信息

public void close(){}

//可选,map完成后,执行关闭操作

下面的程序将一个以逗号分隔的字符串,切分成List,并返回:

package net.csdn.hive.udf;

import java.util.ArrayList;
import java.util.Date;

import org.apache.hadoop.hive.ql.exec.MapredContext;
import org.apache.hadoop.hive.ql.exec.UDFArgumentException;
import org.apache.hadoop.hive.ql.metadata.HiveException;
import org.apache.hadoop.hive.ql.udf.generic.GenericUDF;
import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector;
import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspectorFactory;
import org.apache.hadoop.hive.serde2.objectinspector.PrimitiveObjectInspector;
import org.apache.hadoop.hive.serde2.objectinspector.primitive.PrimitiveObjectInspectorFactory;

/**
* 该函数用于将字符串切分成List,并返回
*/
public class SplitStringGenericUDF extends GenericUDF {

private static int mapTasks = 0;
private static String init = "";
private transient ArrayList ret = new ArrayList();

@Override
public void configure(MapredContext context) {
    System.out.println(new Date() + "######## configure");
    if(null != context) {
        //从jobConf中获取map数
        mapTasks = context.getJobConf().getNumMapTasks();
    }
    System.out.println(new Date() + "######## mapTasks [" + mapTasks + "] ..");
}

@Override
public ObjectInspector initialize(ObjectInspector[] arguments)
throws UDFArgumentException {
    System.out.println(new Date() + "######## initialize");
    //初始化文件系统,可以在这里初始化读取文件等
    init = "init";
    //定义函数的返回类型为java的List
    ObjectInspector returnOI = PrimitiveObjectInspectorFactory
    .getPrimitiveJavaObjectInspector(PrimitiveObjectInspector.PrimitiveCategory.STRING);
    return ObjectInspectorFactory.getStandardListObjectInspector(returnOI);
}

@Override
public Object evaluate(DeferredObject[] args) throws HiveException {
    ret.clear();
    if(args.length < 1) return ret;
    //获取第一个参数
    String str = args[0].get().toString();
    String[] s = str.split(",",-1);
    for(String word : s) {
        ret.add(word);
    }
    return ret;
}

@Override
public String getDisplayString(String[] children) {
    return "Usage: SplitStringGenericUDF(String str)";
}

}

其中   

  •                 在configure方法中,获取了本次任务的Map Task数目;
  •                 在initialize方法中,初始化了一个变量init,并定义了返回类型为java的List类型;
  •                 getDisplayString方法中显示函数的用法;
  •                 evaluate是核心的逻辑处理;

需要特别注意的是,configure方法,“This is only called in runtime of MapRedTask”,该方法只有在运行map task时候才被执行。它和initialize用法不一样,如果在initialize时候去使用MapredContext,则会报Null,因为此时MapredContext还是Null。

上面的函数执行后,在MapReduce的日志中打印出了以下内容:

即在MapReduce阶段,GenericUDF几个方法的执行顺序为:

 

configure–>initialize–>evaluate–>close

 参考链接:Hive UDF开发

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/188376.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

windows系统下安装伪分布式Hadoop3.x

1.下载 1.1下载Hadoop3.1.3 官网地址&#xff1a;https://archive.apache.org/dist/hadoop/common/hadoop-3.1.3/ 选择hadoop-3.1.3.tar.gz 1.2下载工具集winutils 由于Hadoop不直接支持Windows系统&#xff0c;因此需要使用工具集winutils进行支持。 下载网址&#xff1a;…

can‘t be used as a mixin because it extends a class other than ‘Object‘.

程序员如果敲一会就停半天&#xff0c;抱着一杯茶&#xff0c;表情拧巴&#xff0c;那才是在编程 Flutter 项目开发指导 从基础入门到精通使用目录 前言 - 基础关键字 class&#xff1a;声明一个类&#xff0c;提供具体的成员变量和方法实现。abstract class&#xff1a;声明一…

27.日志技术、XML

目录 一.日志技术 1.1 什么是日志 1.2 目前记录日志的方案 1.3 日志技术的优势 1.4 日志技术体系 1.5 Logback框架 1.5.1 下载地址 1.5.2 模块组成 1.5.3 Logback的使用 二.XML 2.1 XML概述 2.2 XML的特点 2.3 XML文件的使用场景 2.4 XMl文件的创建 2.5 XML的语法…

江瀚新材登陆上交所主板:募资约24亿元,甘书官父子为实际控制人

1月31日&#xff0c;湖北江瀚新材料股份有限公司&#xff08;下称“江瀚新材”&#xff0c;SH:603281&#xff09;在上海证券交易所主板上市。本次上市&#xff0c;江瀚新材公开发行股票66,666,667股&#xff0c;发行价格为35.59元/股&#xff0c;发行市盈率为14.80倍。 按发行…

更高性能表现、更低资源占用,高精度计算数据类型 DecimalV3 揭秘

数值运算是数据库中十分常见的需求&#xff0c;例如计算数量、重量、价格等&#xff0c;为了适应多样化运算场景&#xff0c;数据库系统通常支持精准的数字类型和近似的数字类型&#xff0c;当我们需要精确地表示小数并计算小数时&#xff0c;通常会考虑使用 Decimal 数据类型。…

低代码编程核心技术概念

从技术概念来讲&#xff0c;低代码编程跟通用编程是完全一致的。要利用好低代码编程工具&#xff0c;至少要掌握下面的技术概念。低代码编程核心技术概念一、数据结构这里的数据结构&#xff0c;指一般意义上的数据表和数据字段。 类似于数据库中的表及字段的概念&#xff0c;也…

蓝桥杯2022 A组 python

蓝桥杯2022 A组 python A组相对于B组就五道题不一样 第一题&#xff1a;裁纸刀 就先把四个边剪一下&#xff0c;然后先行后列&#xff0c;蛮简单的 # 20行 横着19刀&#xff0c;竖着21*20 print(1921*204)第三题&#xff1a;质因数个数 这题我感觉就是跟一个约数个数的模板一…

【python】Twisted网络编程

Twisted什么是Twisted&#xff1f;为什么使用twisted&#xff1f;Twisted 写TCP通信基本实例- TCP服务端- TCP客户端Twisted的Deferred机制Why Deferred?Deferred TCP-ECHO客户端实现- TCP client为例&#xff0c;什么是Twisted&#xff1f; Twisted是一种非阻塞的网络服务器…

useEffect 依赖项为对象或数组时,引发不断重渲染问题的原因及解法

转载自 https://www.izhaoo.com/2021/11/01/useEffect-object-dependent/背景今天封了个轮子&#xff0c;对组件传入参数生成对应的动画实例&#xff0c;当入参变化时重新渲染新实例。自然而然想到的就是 useEffect 监听 props 依赖了&#xff0c;如&#xff1a;useEffect(() &…

ESD器件(TVS)选型考虑

参考&#xff1a;TOSHIBA《Basics of ESD Protection (TVS) Diodes》①VRWM: Working peak reverse voltage工作峰值反向电压&#xff1a;ESD保护二极管显示非常高的阻抗。高于这个电压&#xff0c;会通过指定大小漏电流。设计的时候&#xff0c;信号的最大出现电压要在这个电压…

Java基础漏洞(六)

巩固Java基础&#xff0c;基于韩顺平老师的课程&#xff0c;Java的封装、继承、多态、super()、this()、重载与重写的区别......&#xff0c;下面我们一点点来巩固练习。 &#xff08;1&#xff09;继承 继承细节1&#xff1a;子类无法继承父类的私有 图1 我们定义一个父类f…

Ansys Zemax | 利用 TrueFreeForm 面进行网格自由曲面的优化

在这篇文章中&#xff0c;我们将演示如何使用 OpticStudio 的 TrueFreeForm 面&#xff0c;设计AR/VR设备中的人眼追迹系统&#xff08;eye-tracking subsystem&#xff09;&#xff0c;这个系统通常位于装置的楔形透镜结构中。此外&#xff0c;为了完成子孔径&#xff08;sub-…

JSBridge:混合开发中的双向通信[Android、iOSJavaScript]

什么是WebView WebView 是移动端中的一个控件&#xff0c;它为 JS 运行提供了一个沙箱环境。WebView 能够加载指定的 url&#xff0c;拦截页面发出的各种请求等各种页面控制功能&#xff0c;JSB 的实现就依赖于 WebView 暴露的各种接口。 由于历史原因&#xff0c;IOS以8为分界…

【Java AWT 图形界面编程】事件处理机制 ② ( Frame 窗口事件监听器 WindowListener | 代码示例 )

文章目录一、Frame 窗口事件监听器 WindowListener二、Frame 窗口事件监听器 WindowListener 代码示例一、Frame 窗口事件监听器 WindowListener 在 AWT 中 , 为 Frame 窗口 添加 窗口事件监听器 WindowListener , 可以监听窗口的操作 , 如 : 窗口显示 WindowListener#windowO…

leetcode 1626. Best Team With No Conflicts(最佳无冲突团队)

scores数组中是每个队员的得分&#xff0c;ages数组中为对应队员的年龄&#xff0c; 现在要从这个队里挑选出一些队员&#xff0c;使总得分最高&#xff0c; 挑选时年龄大的要比年龄小的score更高&#xff08;严格大于&#xff09;&#xff0c;才不会产生冲突。 返回最高的得分…

【nestjs+VueJs全栈】- 后端搭建和数据库抽离

先补充一些nestjs的前置知识 控制器 控制器负责处理传入的请求和向客户端返回响应。 控制器的目的是接收应用的特定请求。路由机制控制哪个控制器接收哪些请求。通常&#xff0c;每个控制器有多个路由&#xff0c;不同的路由可以执行不同的操作。 为了创建一个基本的控制器…

React 组件基础

文章目录1. React 组件的两种创建方式1 使用函数创建组件2 使用类创建组件3 抽离为独立 JS 文件2. React 事件处理1.事件绑定2 事件对象3. 有状态组件和无状态组件4. 组件中的 state 和 setState1 state的基本使用2 setState()修改状态从 JSX 中抽离事件处理程序5.事件绑定 thi…

Python初学如何逆袭高手?22个万能公式汇总大全

嗨害大家好鸭&#xff01;我是小熊猫~ 本篇文章共22个万能公式~ 初学者友好~ 源码资料电子书:点击此处跳转文末名片获取 1、一次性进行多个数值的输入 对于数值的输入问题&#xff0c; 是很多笔试题目中经常遇到的问题&#xff0c; 一次性输入多个参数值 &#xff0c; 可以节…

AppiumDesktop学习总结

Appium学习总结 文章目录Appium学习总结一、简介二、环境准备1.下载并配置安卓SDK环境变量2.下载及安装AppiumDesktop3.安装AppiumDesktop4. 启动AppiumDesktop5.安装Python3.x环境6.安装Appium的Python客户端7.安装安卓模拟器8.安装被测APP&#xff1a;9.连接安卓设备三、运行…

NCRE二级 《MS Office高级应用》备考之路

文章目录一、WORD一、易考点二、解题思路二、EXCEL一、易考点二、解题思路三、PPT一、易考点二、解题思路四、其他一、WORD 一、易考点 1.设置页边距、纸张方向、纸张大小、装订线位置&#xff0c;分栏。 2.设置主题、页面边框、添加水印。 3.设置段间距、行间距、特殊格式&…