hive之UDF编程详解

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

文章目录

      • 1.什么是udf
          • 1.1UDF分类
      • 2.UDF编程示列
          • 2.1pom依赖
          • 2.2UDF编程
          • 2.3打jar包
      • 3.创建UDF函数
          • 3.1创建临时的UDF函数
          • 3.2创建永久生效的UDF函数
          • 3.3编译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包


<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.0modelVersion>
    <groupId>com.wsk.bigdatagroupId>
    <artifactId>g6-hadoopartifactId>
    <version>1.0version>
    <name>g6-hadoopname>
    <properties>
        <maven.compiler.source>1.8maven.compiler.source>
        <maven.compiler.target>1.8maven.compiler.target>
        <project.build.sourceEncoding>UTF-8project.build.sourceEncoding>
        <hadoop.version>2.6.0-cdh5.7.0hadoop.version>
        <hive.version>1.1.0-cdh5.7.0hive.version>
    properties>
    
    <repositories>
        <repository>
            <id>nexus-aliyunid>
            <url>http://maven.aliyun.com/nexus/content/groups/publicurl>
        repository>
        <repository>
            <id>clouderaid>
            <url>https://repository.cloudera.com/artifactory/cloudera-reposurl>
        repository>
    repositories>
    <dependencies>
        
        <dependency>
            <groupId>org.apache.hadoopgroupId>
            <artifactId>hadoop-clientartifactId>
            <version>${hadoop.version}version>
        dependency>
        <dependency>
            <groupId>junitgroupId>
            <artifactId>junitartifactId>
            <version>4.11version>
            <scope>testscope>
        dependency>
        
        <dependency>
            <groupId>org.apache.hivegroupId>
            <artifactId>hive-execartifactId>
            <version>${hive.version}version>
        dependency>
    dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.pluginsgroupId>
                <artifactId>maven-compiler-pluginartifactId>
                <version>2.4version>
                <configuration>
                    <source>1.7source>
                    <target>1.7target>
                    <encoding>UTF-8encoding>
                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编程详解_第1张图片
生成的jar包
hive之UDF编程详解_第2张图片

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张图片

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函数

请参考??

你可能感兴趣的:(Hive)