Hive 自定义函数

什么是自定义函数

hive的内置函数满足不了所有的业务需求。hive提供很多的模块可以自定义功能,比如:自定义函数、serde、输入输出格式等。而自定义函数可以分为以下三类:

UDF: user defined function:用户自定义函数,一对一的输入输出 (最常用的)。比如abs()

UDAF: user defined aggregation function:用户自定义聚合函数,多对一的输入输出,比如:count sum max。

UDTF: user defined table-generate function :用户自定义表生产函数 一对多的输入输出,比如:lateral view explode

如何使用自定义函数

将字符串的首字母变大写案例

创建Maven项目:MyFunction,在pom.xml,加入以下maven的依赖包

sql 复制代码
<dependencies>
    <dependency>
        <groupId>org.apache.hive</groupId>
        <artifactId>hive-exec</artifactId>
        <version>3.1.2</version>
    </dependency>

    <!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-common -->
    <dependency>
        <groupId>org.apache.hadoop</groupId>
        <artifactId>hadoop-common</artifactId>
        <version>3.3.1</version>
    </dependency>
</dependencies>

需要继承一个类:继承org.apache.hadoop.hive.ql.udf.generic.GenericUDF,并重写抽象方法。

java 复制代码
package com.bigdata;

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.primitive.PrimitiveObjectInspectorFactory;

public class UpperDemo extends GenericUDF {
    // 初始化 检查数据的入口是否正常
    @Override
    public ObjectInspector initialize(ObjectInspector[] objectInspectors) throws UDFArgumentException {
        if (objectInspectors.length != 1) {
            // 说明参数的数量不对
            throw new UDFArgumentException("参数数量错误");
        }
        // 返回值类型检查
        return PrimitiveObjectInspectorFactory.javaStringObjectInspector;
    }

    @Override
    public Object evaluate(DeferredObject[] deferredObjects) throws HiveException {
        // 获取这个字符串
        String msg = deferredObjects[0].get().toString(); // hello  hEELo
        String upperCase = msg.toUpperCase();//HELLO
        // 将一个大写字符串拼接后面的小写字符串 就得到了我们想要的
        String newMsg = upperCase.substring(0,1) + msg.substring(1).toLowerCase();
        return newMsg;
    }

    // 展示信息的
    @Override
    public String getDisplayString(String[] strings) {
        return "这是一个首字母会变大写的函数";
    }
}

编写好之后,打jar包。

将该jar包放入 hive的lib文件夹下。

命令加载 (只针对当前session有效)

  1. 将编写好的UDF打包并上传到服务器,将jar包添加到hive的classpath中

add jar /opt/installs/hive/lib/MyFunction-1.0-SNAPSHOT.jar;

  1. 创建一个自定义的临时函数名

create temporary function firstUpper as 'com.bigdata.UpperDemo';

  1. 查看我们创建的自定义函数,

show functions;

4.在hive中使用函数进行功能测试

select firstUpper('yunhe');

  1. 如何删除自定义函数?在删除一个自定义函数的时候一定要确定该函数没有调用

drop temporary function if exists firstUpper;

相关推荐
省钱兄--zs20 小时前
深圳24小时自助健身房软硬件解决方案实战指南与开发流程详解
java·数据仓库·spring boot·小程序·架构
省钱兄--zs1 天前
无人自助拼豆系统架构设计与功能实现落地部署全流程实战指南
java·数据仓库·spring boot·系统架构·需求分析
棣廷1 天前
初识Hive(1)
数据仓库·hive·hadoop
Francek Chen1 天前
【大数据处理与分析】数据仓库Hive:07 Hive HA基本原理
大数据·数据仓库·hive·hadoop·数据分析
棣廷1 天前
初识Hadoop
大数据·hadoop·分布式
这个DBA有点耶1 天前
ELT工具选型:ETL与ELT差异、CDC同步机制与主流工具对比`
数据库·数据仓库·sql·database·dba·etl·数据库管理员
省钱兄--zs1 天前
碰碰好评卡系统开发实战指南 核心功能实现与部署落地全流程拆解
数据仓库·经验分享·spring boot·小程序·架构
磁场转动100万匹1 天前
数仓分层到底在分什么:从 DWD 到 ADS,最后落到 ClickHouse
数据仓库·hive·hadoop
源图客2 天前
YARN介绍与实战
hadoop
buligbulig2 天前
Hadoop正在失败?不,它正在壮大
大数据·hadoop·分布式