写点什么

Hive 的 UDF

  • 2022 年 7 月 03 日
  • 本文字数:1451 字

    阅读完需:约 5 分钟

大家好,我是怀瑾握瑜,一只大数据萌新,家有两只吞金兽,嘉与嘉,上能 code 下能 teach 的全能奶爸

如果您喜欢我的文章,可以[关注⭐]+[点赞👍]+[评论📃],您的三连是我前进的动力,期待与您共同成长~




我们学习 hadoop 的时候,为了让我们不太会 java 语言但是对 SQL 很熟悉的工程师能够操作基本的 mapreduce 计算过程,Hive 被设计出来了。Hive 就好比是 hadoop 在执行 MR(mapreduce)程序的一个操作系统,因为我们可以用简单的 SQL 语句去代替复杂的 MR 程序,因为 Hive 可以将我们的 SQL 语句转化为 MR 程序然后去执行。Hive 的语法和 SQL 的语法很多地方是相同的,所以说它就是为熟连使用 SQL 的工程师设计的。


首先什么是 UDF,UDF 的全称为 user-defined function,用户定义函数,为什么有它的存在呢?有的时候 你要写的查询无法轻松地使用 Hive 提供的内置函数来表示,通过写 UDF,Hive 就可以方便地插入用户写的处理代码并在查询中使用它们,相当于在 HQL(Hive SQL)中自定义一些函数。


UDF 必须用 java 语言编写,Hive 本身就是用 java 写的。所以想学好 hadoop 这个分布式框架的相关技术,熟练使用 java 就是基本功了!Hive 中有三种 UDF:(普通)UDF、用户定义聚集函数(user-defined aggregate function,UDAF)、用户定义表生成函数(user-defined table-generating function,UDTF)。UDF 操作作用于单个数据行,并且产生一个数据行作为输出。大多数函数都属于这一类(比如数学函数和字符串函数)。


UDAF 接受多个输入数据行,并产生一个输出数据行。想 COUNT 和 MAX 这样的函数就是聚集函数。


UDTF 操作作用于单个数据行,并且产生多个数据行-------一个表作为输出


首先一个 UDF 必须满足下面两个条件:


1 一个 UDF 必须是 org.apache.hadoop.hive.ql.exec.UDF 的子类(换句话说就是我们一般都是去继承这个类)


2 一个 UDF 必须至少实现了 evaluate()方法


注意 UDF 名不是大小写敏感的一个 UDAF 计算函数必须实现下面的 5 个方法:


1 init()方法 init()方法负责初始化计算函数并重设它的内部状态。在 MaximumIntUDAFEvaluator 中,我们把存放最终结果的 IntWritable 对象设置为 null。我们使用 null 来表示目前还没有对任何值进行聚集计算,这和对空集 NULL 计算最大值应有的结果是一致的。


2 iterate()方法 每次对一个新值进行聚集计算时都会调用 iterate()方法。计算函数要根据聚集计算的结果更新其内部状态。iterate()接受的参数和 Hive 中被调用函数的参数使对应的。


3 terminatePartial()方法 Hive 需要部分聚集结果时会调用 terminatePartial()方法。这个方法必须返回一个封装了聚集计算当前状态的对象。


4 merge()方法 在 Hive 决定要合并一个部分聚集值和另一个部分聚集值时会调用 merge()方法。该方法接受一个对象作为输入。这个对象的类型必须和 terminatePartial()方法返回的类型一致。


5 terminate() Hive 需要最终聚集结果时会调用 terminate()方法。计算函数需要把状态作为一个值返回。


具体去写 UDF 的过程我这里就不具体说了,我来说说,怎样去把我们写好的 UDF 放到 Hive 中去使用:


首先我们将用 java 写好的 UDF 函数编译后的 Java 类打包成为一个 JAR 文件,并在 Hive 中注册这个文件(相当于告诉 Hive 这个是我写的 UDF):


ADD JAR /path/hive.jar;


给我们写的 UDF 中的 trip 类起个别名


CREATE TEMPORARY FUNCTION strip AS 'com.hadoop.hive.trip';


经过了上面这个过程就可以在 Hive 中使用这个 UDF 了比如 SELECT trip(‘bee‘) FROM table;



结束语

如果您喜欢我的文章,可以[关注⭐]+[点赞👍]+[评论📃],您的三连是我前进的动力,期待与您共同成长~

可关注公众号【怀瑾握瑜的嘉与嘉】,获取资源下载方式

发布于: 刚刚阅读数: 3
用户头像

还未添加个人签名 2022.07.01 加入

还未添加个人简介

评论

发布
暂无评论
Hive的UDF_hive_怀瑾握瑜的嘉与嘉_InfoQ写作社区