一、UDF相关概念
UDF,用户自定义函数,可以直接在SQL语句中计算的函数:三个优点:
v1、允许实现模块化的程序设计。方便修改代码、增加函数
v2、UDF的执行速度很快,通过缓存计划在语句重复执行时降低代码的编译开销。比存储方法的执行效率更高。
v3、可用于减少网络流量
UDF 存放在内存中, 设计不当将导致系统的崩溃, 所以必须在必要的时候实施优化。 对 UDF 的优化是通过手动改写原来的 UDF 代码实现的, 主要有以下两种场景:
1) 如果 UDF 嵌套过于复杂, 可以重新写一个嵌套层数较少的且可实现相同功能的 UDF, 使性能成倍提升。
2) 针对过滤类的 UDF, 将过滤率高的放在前面, 减少中间结果, 避免不必要的计算。
二、实例
1、导包
<properties> <hive-version>2.1.1</hive-version> <hadoop-version>2.7.2</hadoop-version> </properties> <artifactId>hive-UDF</artifactId> <dependencies> <dependency> <groupId>org.apache.hive</groupId> <artifactId>hive-exec</artifactId> <version>${hive-version}</version> </dependency> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-common</artifactId> <version>${hadoop-version}</version> </dependency>
</dependencies>
2、创建类继承UDF
创建方法public string evaluate(Text text)编写代码
public class MyUdfTest extends UDF { public String evaluate(Text text){ String result="格式不正确"; if(text!=null&&text.getLength()==11){ String str=text.toString(); result=str.substring(0,3)+"****"+ str.substring(7); } return result; } 说明:我这里对电话号码中间四位进行遮掩,如果格式不为11位,则返回格式不正确
4、将代码打包上传到HDFS上
5、添加jar

add jar hdfs://nameservice1/yang/hive-UDF-1.0-SNAPSHOT.jar 注意:这里一定要写绝对路径,不然会报错:找不到jar
6、创建一个临时函数
create temporary function UDF_test as 'UDFTest'; show functions;可以查看自定义函数是否创建成功 创建永久函数 CREATE PERMANENT FUNCTION cao02_udtf AS 'com.wutest.udtf02' USING JAR 'hdfs://nameservice1/tmp/cao02.jar';
7、创建表并导入数据
--1、创建表 CREATE TABLE people(name STRING,phone STRING) CLUSTERED BY (name) INTO 7 BUCKETS STORED AS ORC tblproperties('transactional'='true'); --2、入数据 insert into people values('A','13550697449'); insert into people values('B','13355557985'); insert into people values('C','165862934666'); insert into people values('D','126489'); insert into people values('E','464823646253'); 导入数据1和2为正确格式,3,4,5,格式不正确
8、使用临时函数进行测试
补充说明:
当一个project中存在多个UDF函数时,打包如下:

