ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

hive之UDF编程详解

2019-04-20 19:49:55  阅读:286  来源: 互联网

标签:函数 lib jar hadoop 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包

打包
1
生成的jar包
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环境
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函数

请参考??

标签:函数,lib,jar,hadoop,hive,详解,UDF
来源: https://blog.csdn.net/qq_32641659/article/details/89421696

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有