Hive中的自定义函数UDF的实现过程说明记录

1. 引言

近期在学习大数据的过程中,使用了CDH版本的Hadoop、Hive等,将编写Hive自定义函数UDF的过程记下来,以备查看和参考。

2. 环境准备

开发环境:JDK1.8、IEDA 2018.3.5

操作环境:安装了CDH版本的大数据组件的Linux系统(虚拟机),包括了Hadoop、Hive、Sqoop

3. 实现过程

3.1 搭建IDEA开发环境

(1)贴上pom.xml的内容



    4.0.0

    com.fanling
    hivedemo
    jar
    1.0.0

    
        
            cloudera
            cloudera-repository
            https://repository.cloudera.com/artifactory/cloudera-repos/
            default
            
                true
            
            
                false
            
        
    

    
        
            org.apache.hadoop
            hadoop-client
            2.6.0-cdh5.14.2
        

        
            org.apache.hive
            hive-exec
            1.1.0-cdh5.14.2
        

        
            org.apache.hive
            hive-jdbc
            1.1.0-cdh5.14.2
        

        
            mysql
            mysql-connector-java
            5.1.27
        
    

    
        
            
                org.apache.maven.plugins
                maven-compiler-plugin
                
                    1.8
                    1.8
                
            
        
    

在初始化环境的时候,遇到了jar包无法下载的问题,本地maven配置了阿里源,阿里源中没有cdh版本的jar包,于是在pom.xml中添加了指定仓库

    
        
            cloudera
            cloudera-repository
            https://repository.cloudera.com/artifactory/cloudera-repos/
            default
            
                true
            
            
                false
            
        
    

然而没有生效,还是从settings.xml中读取下载地址,经过排查发现是settings.xml中的mirrorOf节点配置错误,让所有jar包都通过此镜像下载,*表示所有的资源,添加,!cloudera表示除了cloudera,其他用法请自行查阅,不再说明。

修改为如下

    
      nexus-aliyun
      *,!cloudera
      Nexus aliyun
      http://maven.aliyun.com/nexus/content/groups/public
    

重新导入jar,环境搭建成功!

3.2 编写测试程序

package com.fanling.hivedemo;

import org.apache.hadoop.hive.ql.exec.UDF;
import org.apache.hadoop.io.Text;

public class MyUDF extends UDF {
    public Text evaluate(Text field) {
        if (field == null) {
            return null;
        } else {
            return new Text(field.toString().toLowerCase());
        }
    }
}

继承 org.apache.hadoop.hive.ql.exec.UDF,并且实现evaluate方法,支持重载。

完成以上编码后,在本地输入字符进行测试,输入大写字母,将输出小写字母

package com.fanling.hivedemo;

import org.apache.hadoop.hive.ql.exec.UDF;
import org.apache.hadoop.io.Text;

public class MyUDF extends UDF {
    public Text evaluate(Text field) {
        if (field == null) {
            return null;
        } else {
            return new Text(field.toString().toLowerCase());
        }
    }

    public static void main(String[] args) {
        System.out.println(new MyUDF().evaluate(new Text("FANLING")));
    }
}

// 输出结果
fanling

Process finished with exit code 0

通过mvn 打jar包,上传到Linux用于跟目录上。 

如果出现报错:

could not be resolved: 
org.pentaho:pentaho-aggdesigner-algorithm:jar:5.1.5-jhyde, 
eigenbase:eigenbase-properties:jar:1.1.4:

解决:下载jar包到本地仓库对应路径。

pentaho-aggdesigner-algorithm-5.1.5-jhyde.jar下载地址 | eigenbase-properties-1.1.4.jar下载地址

3.3 Hive自定义函数使用

hive (default)> add jar /home/fanl/lib/hivedemo-1.0.0.jar;
Added [/home/fanl/lib/hivedemo-1.0.0.jar] to class path
Added resources: [/home/fanl/lib/hivedemo-1.0.0.jar]
hive (default)> create temporary function mylowwer as 'com.fanling.hivedemo.MyUDF';
OK
Time taken: 0.274 seconds
hive (default)> select mylowwer(ename) from emp;
OK
_c0
smith
allen
ward

4. 总结

cloudera仓库缺少的jar包可以从maven中央仓库下载。

你可能感兴趣的:(大数据开发)