hive UDF函数

一、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函数时,打包如下:

 

 

 

 

 

 

posted @ 2019-03-05 11:34  xiaolaotou  阅读(4190)  评论(0编辑  收藏  举报