分类
- UDF(User- Defined- Function)用户自定义函数,输入一个数据然后产生数据;
- UDAF(User- Defined Aggregation Function)用户自定义聚合函数,多个输入数据然后产生出参数;
- UDTF(User- Defined Table-generating Function)用户自定义表生成函数,输入一行数据生成N行数据
步骤
- 新建maven工程
package com.dtstack.hivesqludf; - pom.xml 添加 Hadoop和Hive依赖
<dependencies>
<!-- 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>
<!-- https://mvnrepository.com/artifact/org.apache.hive/hive-exec -->
<dependency>
<groupId>org.apache.hive</groupId>
<artifactId>hive-exec</artifactId>
<version>3.1.2</version>
</dependency>
</dependencies>
- 定义一个类, 继承相关父类, 完成逻辑编写
- maven–package打包
- 资源管理-上传资源
- 注册函数(类名前要带上包名)
UDF
UDF实现的两种策略:
Hive的UDF主要分为2种类型UDF, Genericudf
1)UDF为一种比较简单的类,继承的基类为org. apache. hadoop.hive.ql.exec.UDF;
2) Genericudf相对复杂一些,主要针对于类型检查等具有更好的控制,继承的基类为
org. apache hadoop. hive. ql udf. generic. GenericUDF;
继承UDF,重写以下函数:
- evaluate
- 继承GenericUFD,重写以下函数:
- initialize: 验证参数类型和参数个数
- evaluate: 真正的逻辑
- getDisplayString: 返回描述该方法的字符串,没有太大作用
UDTF
解决输入一行输出多行的需求
需要继承GenericUDTF类
- initialize: 返回UDTF返回行的信息(返回个数,类型)
@Override
public StructObjectInspector initialize(ObjectInspector[] argOIs) throws UDFArgumentException {
//1.定义输出数据的列名和类型
//用来存储炸裂之后的列的列名,因为炸裂函数可能炸出多列,所以在存储列名的时候需要一个集合
List<String> fieldNames = new ArrayList<>();
// 用于存储炸裂之后,输出列的类型
List<ObjectInspector> fieldOIs = new ArrayList<>();
//2.添加输出数据的列名和类型
fieldNames.add("lineToWord");
fieldOIs.add(PrimitiveObjectInspectorFactory.javaStringObjectInspector);
return ObjectInspectorFactory.getStandardStructObjectInspector(fieldNames,fieldOIs);
}
![[UDTF_init方法.png]]
- process: 真正的逻辑,每一次forwar()调用产生一行;如产生多列可放在一个数组中传入forward()函数
- close: 对需要清理的方法进行清理,一般用不上
UDAF
继承 GenericUDAFEvaluator需要实现如下方法:
1、int(初始化):确定返回类型并返回UDAF的返回类型
2、getNewAggregationBuffer:创建新的聚合计算的需要的内存,用来存储 mapper, combiner, reducer运算过程中的相加总和,获取聚合中间结果缓存
3、reset:重置中间结果缓存
4、iterate:迭代每一行的数据,等同于Map阶段。传进来的行数据由 HIVESQL决定,计算的中间结果缓存到Aggregationbuffer,@ param aggregationbuffer中间结果缓存,@ param objects行中每一列的数据
5、terminatepartial(终止部分):对部分中间结果数据进行合并,等同于Map阶段的 combine,返回 mapper结果combine后的结果
6、merge(合并):在最终进行 terminate()前对所有传入的中间结果进行合并,等同于 Reduce阶段的 merge。各个Map传来的中间结果 partial合并到 aggregationbuffer;
7、terminate(终止):计算合并后的数据得出最终结果,等同于 Reduce阶段的逻辑。 reducer返回结果,或者是只有
mapper,没有 reducer时,在 mapper端返回结果
注意
collect_set函数返回的虽然是String[] 但在这里不能直接使用String[]来接收,需要使用ArrayList
这篇博客介绍了Spark中的UDF、UDTF和UDAF。UDF是用户自定义函数,用于单个输入数据产生结果;UDAF是用户自定义聚合函数,处理多个输入数据产生单一输出;UDTF则是用户自定义表生成函数,将一行数据转换为多行。博客详细阐述了每个类型的实现步骤和关键方法,并提供了相关的类继承和方法重写说明。
6889

被折叠的 条评论
为什么被折叠?



