前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >2021年大数据Hive(八):Hive自定义函数

2021年大数据Hive(八):Hive自定义函数

作者头像
Lansonli
发布2021-10-11 15:39:33
8650
发布2021-10-11 15:39:33
举报
文章被收录于专栏:Lansonli技术博客Lansonli技术博客

Hive自定义函数

一、概述

Hive 自带了一些函数,比如:max/min等,但是数量有限,自己可以通过自定义UDF来方便的扩展。

当Hive提供的内置函数无法满足你的业务处理需要时,此时就可以考虑使用用户自定义函数(UDF:user-defined function)。

根据用户自定义函数类别分为以下三种:

1、UDF(User-Defined-Function)

一进一出  

类似于:lower/lower/reverse

2、UDAF(User-Defined Aggregation Function)

聚集函数,多进一出

类似于:count/max/min

3、UDTF(User-Defined Table-Generating Functions)

一进多出

如lateral view explode()

二、自定义UDF

编程步骤:

(1)继承org.apache.hadoop.hive.ql.exec.UDF

(2)需要实现evaluate函数;evaluate函数支持重载;

注意事项:

(1)UDF必须要有返回类型,可以返回null,但是返回类型不能为void;

(2)UDF中常用Text/LongWritable等类型,不推荐使用java类型;

​​​​​​​1、代码编写

第一步:创建maven  java 工程,导入jar包

代码语言:javascript
复制
<dependencies>

    <dependency>

        <groupId>org.apache.hive</groupId>

        <artifactId>hive-exec</artifactId>

        <version>2.1.0</version>

    </dependency>

    <dependency>

        <groupId>org.apache.hadoop</groupId>

        <artifactId>hadoop-common</artifactId>

        <version>2.7.5</version>

    </dependency>

</dependencies>

第二步:开发java类继承UDF,并重载evaluate 方法

代码语言:javascript
复制
public class MyUDF  extends UDF{

    public Text evaluate(final Text s) {

        if (null == s) {

            return null;

        }

        //返回大写字母

        return new Text(s.toString().toLowerCase());

    }

}

​​​​​​​2、函数使用方式1-临时函数

1、将我们的项目打包,并上传到hive的lib目录下

2、添加我们的jar包

将jar包上传到 /export/server/hive-2.1.0/lib目录,并重命名我们的jar包名称

代码语言:javascript
复制
cd /export/server/hive-2.1.0/lib

mv original-day_10_hive_udf-1.0-SNAPSHOT.jar my_lower.jar

3、hive的客户端添加我们的jar包

代码语言:javascript
复制
hive>add jar /export/server/hive-2.1.0/lib/my_lower.jar

​​​​​​​

4、设置函数与我们的自定义函数关联-临时函数

代码语言:javascript
复制
hive>create temporary function my_lower as 'cn.it.udf.MyUDF';

5、使用自定义函数

代码语言:javascript
复制
hive>select my_lower('abc');

​​​​​​​3、函数使用方式2-永久函数

代码语言:javascript
复制
1. 把自定义函数的jar上传到hdfs中.

hadoop fs -mkdir /hive_func

hadoop fs -put my_lower.jar /hive_func  

2. 创建永久函数

hive>  create function my_lower2 as 'cn.it.udf.MyUDF' using jar 'hdfs://node1:8020/hive_func/my_lower.jar';

3. 验证

hive> select my_lower2("Hello World");

三、自定义UDTF

​​​​​​​1、需求

自定义一个UDTF,实现将一个任意分隔符的字符串切割成独立的单词,例如:

代码语言:javascript
复制
源数据:

"zookeeper,hadoop,hdfs,hive,MapReduce"

目标数据:

zookeeper

hadoop

hdfs

hive

MapReduce

​​​​​​​2、代码实现

代码语言:javascript
复制
import org.apache.hadoop.hive.ql.exec.UDFArgumentException;

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;

import java.util.List;

import java.util.function.ObjDoubleConsumer;



public class MyUDTF extends GenericUDTF {

    private final transient Object[] forwardListObj = new Object[1];



    @Override

    public StructObjectInspector initialize(StructObjectInspector argOIs) throws UDFArgumentException {

        //设置列名的类型

        List<String> fieldNames = new ArrayList<>();

        //设置列名

        fieldNames.add("column_01");

        List<ObjectInspector> fieldOIs = new ArrayList<ObjectInspector>()  ;//检查器列表



        //设置输出的列的值类型

        fieldOIs.add(PrimitiveObjectInspectorFactory.javaStringObjectInspector);

         

        return ObjectInspectorFactory.getStandardStructObjectInspector(fieldNames, fieldOIs);



    }



    @Override

    public void process(Object[] objects) throws HiveException {

        //1:获取原始数据

        String args = objects[0].toString();

        //2:获取数据传入的第二个参数,此处为分隔符

        String splitKey = objects[1].toString();

        //3.将原始数据按照传入的分隔符进行切分

        String[] fields = args.split(splitKey);

        //4:遍历切分后的结果,并写出

        for (String field : fields) {

            //将每一个单词添加值对象数组

            forwardListObj[0] = field;

            //将对象数组内容写出

            forward(forwardListObj);

        }



    }



    @Override

    public void close() throws HiveException {



    }

}

​​​​​​​3、添加我们的jar包

将打包的jar包上传到node3主机/export/data/hive-2.1.0/lib目录,并重命名我们的jar包名称

代码语言:javascript
复制
cd /export/data/hive-2.1.0/lib

mv original-day_10_hive_udtf-1.0-SNAPSHOT.jar my_udtf.jar

hive的客户端添加我们的jar包,将jar包添加到hive的classpath下

代码语言:javascript
复制
hive> add jar /export/server/hive-2.1.0/lib/my_udtf.jar;

​​​​​​​4、创建临时函数与开发后的udtf代码关联

代码语言:javascript
复制
hive>create temporary function my_udtf as 'cn.itcast.udtf.MyUDTF';

​​​​​​​5、使用自定义udtf函数

代码语言:javascript
复制
hive>select my_udtf("zookeeper,hadoop,hdfs,hive,MapReduce",",") word;

  • 📢博客主页:https://lansonli.blog.csdn.net
  • 📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!
  • 📢本文由 Lansonli 原创,首发于 CSDN博客🙉
  • 📢大数据系列文章会每天更新,停下休息的时候不要忘了别人还在奔跑,希望大家抓紧时间学习,全力奔赴更美好的生活✨
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-06-16 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Hive自定义函数
    • 一、概述
      • 1、UDF(User-Defined-Function)
      • 2、UDAF(User-Defined Aggregation Function)
      • 3、UDTF(User-Defined Table-Generating Functions)
    • 二、自定义UDF
      • ​​​​​​​1、代码编写
      • ​​​​​​​2、函数使用方式1-临时函数
      • ​​​​​​​3、函数使用方式2-永久函数
    • 三、自定义UDTF
      • ​​​​​​​1、需求
      • ​​​​​​​2、代码实现
      • ​​​​​​​3、添加我们的jar包
      • ​​​​​​​4、创建临时函数与开发后的udtf代码关联
      • ​​​​​​​5、使用自定义udtf函数
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档