大数据技术架构(组件)17——Hive:UDF/UDTF/UDAF三者区别

news2024/10/7 10:13:41

1.4.12、三者区别

1.4.12.1、UDF

UDF全称为User Defined Function(即用户自定义函数),UDF开发在日常工作当中是非常普遍的。我们写一段SQL,调用UDF,得到结果就算是结束了,但大家有没有想过UDF底层是怎么执行的呢?那么我们拿MR引擎为例,那UDF是在Map端执行还是在Reduce端执行的呢?说实话,我之前没想过。

既然没想过,那今天就来想一想。首先抛开在哪端执行不说,那我们知道UDF的模式是我们给一个值,然后再返回一个值。如上图所示,传一个A,返回给一个A_1;传一个B,返回给一个B_1;传一个C返回给一个C_1;

这种模式就相当于在传入的一个值上进行了一些修饰后再返回给我们,相当于是一对一的模式。梳理到这里,答案也比较清晰了,这不就是map功能吗。有些同学可能会质疑,没关系,我们explain一下就知道了。

如上图所示,只有一个fetch Operator,当然这个demo比较简单,不会走MR的。从这里也可以看出来这就是一个转换功能,但有些同学仍有疑惑,没关系,让我们来一个走MR的例子。

explain select substr(id,2),count(1) from test group by substr(id,2);

到这里总能证明UDF函数是在Map阶段执行的吧!

1.4.12.2、UDF编写

对于如何开发UDF,网上模板一大堆,这里不再叙述。下面出一个关于year函数的内部实现,供大家参考

public class UDFYear extends UDF {
    private final SimpleDateFormat formatter = new SimpleDateFormat("yyyy-IM-dd");
    private final Calendar calendar = Calendar.getInstance();
    private final IntWritable result = new Intwritable();

    public UDFYear() {}

    public Intwritable evaluate(Text datestring) {
        if (dateString == null) return null;
        try {
            Date date = formatter.parse(datestring.tostring());
            calendar.setTime(date);
            result.set(calendar.get(Calendar.YEAR));
            return result;
        } catch (ParseException e) {
            return null;
        }
    }

    public IntWritable evaluate(Datewritable d) {
        if (d == null) {
            return null;
        }
        calendar.setTime(d.get());
        result.set(calendar.get(Calendar.YEAR));
        return result;
    }

    public IntWritable evaluate(Timestampwritable t) {
        if (t == null) {
            return null;
        }
        calendar.setTime(t.getTimestamp());
        result.set(calendar.get(Calendar.YEAR));
        return result;
    }
}

1.4.12.3、UDAF

UDAF全称为User-defined Aggregation Function,从命名来看,这是一种聚合函数,比如像我们常用的sum、max。如下图所示,可以抽象的理解成传入多个值,最后返回给我们一个值。那么对于该类型的函数是不是一定在reduce端执行了,为什么这么说呢?你看sum函数是不是会发生shuffle,是不是在reduce端做全局聚合呢(如果你这样想也没问题,但也有问题)

我们通过explain命令来验证一下想法。我们执行如下命令:

explain select sum(id) from test

如上图所示,对于SUM类型的UDAF是在map端和reduce端都执行了,哎呦,这是怎么回事呢?我们回想一下MapReduce机制,如果我们要做全局聚合,难道要把所有的数据都拉取到reduce端吗?那reduce端压力是不是就会很大。所以有了局部聚合的这么一种优化方式。

那我们把局部聚合优化阶段给关闭后,再来看一下UDAF会在那一端执行

--关闭map端聚合
set hive .map.aggr=false ;

如上图所示,当我们把局部聚合优化功能给关闭后,UDAF只会在reduce执行。

1.4.12.4、UDTF

UDTF全称为User-defined Table Generating Function,该模式的功能是通过输入一行,返回多行。在实际场景中用的不多,该类型的执行阶段通常是在本地,大家也可以理解成是做map转换和UDF是一样的阶段。

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

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

相关文章

CSS语法指南

学前需求 需要对HTML有一定的了解 什么是 CSS? CSS 指层叠样式表 (Cascading Style Sheets) 样式定义如何显示 HTML 元素样式通常存储在样式表中把样式添加到 HTML 4.0 中,是为了解决内容与表现分离的问题外部样式表可以极大提高工作效率外部样式表通常存储在 CS…

操作系统—王道考研之进程管理

by:星辰 课程视频链接:https://www.bilibili.com/video/BV1YE411D7nH 第 2 章 进程管理 2.1 进程与线程 2.1.1 进程的定义、特征、组成、组织 2.1.1.1 总览 2.1.1.2 进程的定义 (1)程序的概念 程序:一组计算机能识别和执行的指令。 是静…

C语言及算法设计课程实验五:循环结构程序设计

C语言及算法设计课程实验五:循环结构程序设计一、实验目的二、实验内容2.1、统计字符个数2.2、输出所有的“水仙花数”2.3、猴子吃桃问题2.4、牛顿迭代法求方程三、实验步骤3.1、循环结构程序设计实验题目一:统计字符个数1、定义变量2、 输入一串字符3、…

基础IO(上)

基础IO(上)回顾文件知识回顾C文件接口系统文件I/O接口介绍openclosewriteread理解文件描述符fd理解0 1 2 3 4....文件描述符的分配规则重定向的本质及相关操作认识重定向重定向的具体原理重定向的操作追加重定向和输入重定向追加重定向输入重定向缓冲区的…

C++ STL源码剖析 笔记补充

写在前面 简单记录一些《C STL源码剖析中》涉及到的C语法和注意事项。 1. 静态常量成员在类内直接初始化 如果含有const static integral类型的成员变量,可以在类内定义时直接初始化; 注意integral不只是int类型,而是包含所有的整型&#…

< 每日算法 - Javascript解析:经典弹珠游戏 >

每日算法 - JavaScript解析:弹珠游戏一、任务描述:》 示例一:》示例二二、题意解析三、解决方案:往期内容 💨一、任务描述: 欢迎各位来到「力扣嘉年华」,接下来将为各位介绍在活动中广受好评的…

HSAF实战收获

收获1:MySQL数据类型对应Java类型表格这里的timestamp类型在Java中对应TimeStamp类型,varchar和char都是对饮的String类型收获2:TableFieldTableField(exist false) 注解加载bean属性上,表示当前属性不是数据库的字段&#xff0c…

[golang Web开发] 4.golang web开发:模板引擎

一.简介 使用 Go 的 Web 模板引擎需要以下两个步骤: (1).对文本格式的模板源进行语法分析,创建一个经过语法分析的模板结构,其中模板源既可以是一个字符串,也可以是模板文件中包含的内容 (2).执行经过语法分析的模板,将ResponseWr…

Django User模型

Django User模型用户管理自定义用户模型Django自定义验证引用User模型视图开发创建序列器创建视图创建路由用户注册注册序列化器注册视图注册路由用户管理 在开发登录功能的时候需要数据库来保存用户登录信息和状态,Django中有个内置app 名为 django.contrib.auth …

ICT是什么

信息与通信技术(ICT,information and communications technology)是一个涵盖性术语,覆盖了所有通信设备或应用软件:比如说,收音机、电视、移动电话、计算机、网络硬件和软件、卫星系统,等等&…

(1)Nginx简介和安装教程

目录 一、下载 二、报错提醒&环境安装 1、安装gcc编译器 2、安装perl库 3、安装 zlib库 4、也可通过命令进行统一安装 三、编译及安装 四、启动并访问 1、启动 2、访问 3、问题排查 五、安装成系统文件 一、下载 官网地址:nginx news Nginx官网提供…

OAuth2入门

1.下载资源 演示代码: OAuth2-example: 演示OAuth2的认证流程https://gitee.com/lisenaq/oauth2-example克隆下载到本地: 导入项目: client 客户 authorization-server 认证服务 resource-owner 资源所有者 resource-server 资源…

儿童台灯哪个品牌更护眼推荐?儿童书桌台灯品牌排行榜

不难发现,近些年我国儿童近视率增长迅速,随着生活条件越来越好,对电子章产品的普及非常广泛,每个家庭的孩子必不可少的就是伏案完成作业,这样的话就需要使用到台灯,选购台灯的时候最好选择适合儿童的专业护…

【算法基础】高精度加法

👦个人主页:Weraphael ✍🏻作者简介:目前是C语言学习者 ✈️专栏:【C/C】算法 🐋 希望大家多多支持,咱一起进步!😁 如果文章对你有帮助的话 欢迎 评论💬 点赞…

一篇五分生信临床模型预测文章代码复现——FIgure 9.列线图构建,ROC分析,DCA分析 (三)

之前讲过临床模型预测的专栏,但那只是基础版本,下面我们以自噬相关基因为例子,模仿一篇五分文章,将图和代码复现出来,学会本专栏课程,可以具备发一篇五分左右文章的水平: 本专栏目录如下: Figure 1:差异表达基因及预后基因筛选(图片仅供参考) Figure 2. 生存分析,…

axios实战学习——使用高德地图api接口数据实现天气查询案例

文章目录📋前言🎯案例介绍🧩关于高德开发平台1️⃣创建应用生成Key2️⃣查看API文档🧩测试接口🎯案例编写🎯实现效果📋前言 关于这个Vue axios 获取接口数据的操作,这篇文章就不过…

UniRx之基础入门

什么是Rx 官方ReactiveX简介: An API for asynchronous programming with observable streams。 通过这句话我们可以得到: 1.首先Rx是个编程接口,不同语言提供不同实现。例如JVM语言中的RxJava。 2.使用场景,异步编程中。 3.基…

路由器 内核开发 流程

宽 带上网已经不是什么新鲜事情,人们对相关的网络器件已经不再陌生,比如说常见的路由器。对于一般的网络用户,他们能知道怎样使用路由器来上网、玩游戏等就 已经感到很满足了,通常情况下对路由器的深层技术很少去过问研究&#xf…

Matlab和PCL中的点云滤波

而在PCL中总结了几种需要进行点云滤波处理的情况,这几种情况分别是: (1)点云数据密度不规则需要平滑。 (2)因为遮挡等问题造成离群点需要去除。 (3)大量数据需要进行“下采样”(Downsample)。 (4)噪声数据需要去除。 对应的解决方法是: (1)按…

什么是ITIL中的变更管理

商业环境和客户期望在不断变化,数字化转型已成为各行各业企业成功的关键因素。数字化转型的关键在于利用可用 应对业务挑战和抓住机遇的技术。当你分解它时,数字化转型基本上是信息技术管理更好地消除有问题的领域,并使您的 IT 基础架构能够应…