hive之UDF编程详解

前言:本文详解介绍UDF编程过程,以及hive中创建UDF函数的两种方式

文章目录

1.什么是udf

UDF(User-Defined Functions)即是用户自定义的hive函数。hive自带的函数并不能完全满足业务的需求,这时就需要我们自定义函数了。
官网参考地址:LanguageManual UDF

1.1UDF分类
  • UDF: one to one ,进来一个出去一个,row mapping。 是row级别操作,如:upper、substr函数
  • UDAF: many to one,进来多个出去一个,row mapping。是row级别操作,如sum/min。A:aggregation
  • UDTF:one to mang,进来一个出去多行。如lateral view 与 explode,T:table-generating

本文这里只记录UDF类型函数的编程以及集成。

2.UDF编程示列

首先创建一个普通的maven工程,maven工程创建网上有很多资料,也很简单,这里就跳过了。

2.1pom依赖

pom文件如下,主要是添加hive-exec的jar包

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.wsk.bigdata</groupId>
    <artifactId>g6-hadoop</artifactId>
    <version>1.0</version>
    <name>g6-hadoop</name>
    <properties>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <hadoop.version>2.6.0-cdh5.7.0</hadoop.version>
        <hive.version>1.1.0-cdh5.7.0</hive.version>
    </properties>
    <!--添加CDH的仓库-->
    <repositories>
        <repository>
            <id>nexus-aliyun</id>
            <url>http://maven.aliyun.com/nexus/content/groups/public</url>
        </repository>
        <repository>
            <id>cloudera</id>
            <url>https://repository.cloudera.com/artifactory/cloudera-repos</url>
        </repository>
    </repositories>
    <dependencies>
        <!--添加Hadoop的依赖-->
        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-client</artifactId>
            <version>${hadoop.version}</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.11</version>
            <scope>test</scope>
        </dependency>
        <!--添加hive依赖-->
        <dependency>
            <groupId>org.apache.hive</groupId>
            <artifactId>hive-exec</artifactId>
            <version>${hive.version}</version>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>2.4</version>
                <configuration>
                    <source>1.7</source>
                    <target>1.7</target>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>
2.2UDF编程

主要是通过集成UDF类,编写evaluate方法实现UDF编程,如下HelloUDF类

package com.wsk.bigdata.udf;

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

public class HelloUDF extends UDF {

    public String evaluate(String value) {
        return "hello:" + value;
    }

    public static void main(String[] args) {
        HelloUDF helloUDF = new HelloUDF();
        String value = helloUDF.evaluate("wsk");
        System.out.println(value);
    }
}
2.3打jar包

打包
hive之UDF编程详解
生成的jar包
hive之UDF编程详解

3.创建UDF函数

创建UDF函数有三种方式

  • 创建临时的UDF函数,只对当前session生效
  • 创建永久的UDF函数
  • 编译hive源码支持UDF函数,对所有部署编译后的hive生效。
3.1创建临时的UDF函数

生产不推荐

#上传jar包
[hadoop@hadoop001 lib]$ rz
[hadoop@hadoop001 lib]$ ll
total 12
-rw-r--r--. 1 hadoop hadoop 11447 Apr 19  2019 g6-hadoop-1.0.jar

#创建临时的UDF函数
若不想执行add操作可以将jar复制到 $HIVE_HOME/auxlib 特定的目录
ADD JAR /home/hadoop/lib/g6-hadoop-1.0.jar;
CREATE TEMPORARY FUNCTION sayHello_1 AS 'com.wsk.bigdata.udf.HelloUDF';

我这里报异常,异常信息: Unsupported major.minor version 52.0
思索后想起,我部署的jdk用的是1.7,而我编译UDF用的是jdk1.8,低版本环境是无法运行高版本jar的,重新部署1.8的jdk重启hadoop,同时降低UDFjar包编译的版本

#测试,临时函数只对当前session生效
hive> select sayHello_1("wsk") ;
OK
hello:wsk
Time taken: 0.175 seconds, Fetched: 1 row(s)

#检查mysql中的元数据,因为是临时函数,故元数据中并没有相关的信息
mysql> select * from funcs;
Empty set (0.11 sec)

降低项目编译版本方法,如下运行的是jdk1.8环境,编译使用的是1.7环境
hive之UDF编程详解

3.2创建永久生效的UDF函数

通过上传hdfs实现。

#将jar上传到指定目录
[hadoop@hadoop001 ~]$ hdfs dfs -ls /lib
[hadoop@hadoop001 ~]$ hdfs dfs -put ~/lib/g6-hadoop-1.0.jar  /lib/
[hadoop@hadoop001 ~]$ hdfs dfs -ls /lib
Found 1 items
-rw-r--r--   1 hadoop supergroup      11543 2019-04-15 01:43 /lib/g6-hadoop-1.0.jar

#创建永久生效的UDF函数
CREATE FUNCTION sayhello_2 AS 'com.wsk.bigdata.udf.HelloUDF'
USING JAR 'hdfs://hadoop001:9000/lib/g6-hadoop-1.0.jar';

#测试
hive> select sayHello_2("wsk2") ;
OK
hello:wsk2

#检查mysql中的元数据,测试函数的信息已经注册到了元数据中
mysql> select * from funcs;
+---------+------------------------------+-------------+-------+------------+-----------+------------+------------+
| FUNC_ID | CLASS_NAME                   | CREATE_TIME | DB_ID | FUNC_NAME  | FUNC_TYPE | OWNER_NAME | OWNER_TYPE |
+---------+------------------------------+-------------+-------+------------+-----------+------------+------------+
|       1 | com.wsk.bigdata.udf.HelloUDF |  1555263915 |     6 | sayhello_2 |         1 | NULL       | USER       |
+---------+------------------------------+-------------+-------+------------+-----------+------------+------------+


3.3编译hive支持自定义的UDF函数

请参考??

上一篇:webkit下面的CSS设置滚动条


下一篇:关于在hive中使用python做UDF的总结