hive之UDF函数编程详解

UDF的定义

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

UDF的分类

  1. UDF:one to one,进来一个出去一个,row mapping。是row级别操作,如:upper、substr函数
  2. UDAF:many to one,进来多个出去一个,row mapping。是row级别操作,如sum/min。
  3. UDTF:one to many ,进来一个出去多个。如alteral view与explode
  • 这三类中,我们只对UDF类的函数进行改写

pom文件配置

<?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.7</maven.compiler.source>
<maven.compiler.target>1.7</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>

UDF函数编写

打jar包

上传jar包

 [[email protected] lib]$ rz

[[email protected] lib]$ ll  g6-hadoop-1.0.jar

-rw-r--r--. 1 hadoop hadoop 11447 Apr 19 2019 g6-hadoop-1.0.jar
  • 注意:如果jar包是上传到$HIVE_HOME/lib/目录以下,就不需要执行add命令了

添加jar包到hive

  • 语法:add jar +jar包所在的目录/jar包名字
hive> add jar /home/hadoop/data/hive/g6-hadoop-1.0.jar;

在hive中创建UDF函数

  • 创建临时函数    -----只对当前黑窗口有效

  • 语法:
CREATE TEMPORARY FUNCTION function_name AS class_name;   

function_name函数名                        

*******class_name 类路径,包名+类名*********   这里就是你写的UDF函数的第一行的package后边的东西然后在加个点加个类的名字

实例:

hive>CREATE TEMPORARY FUNCTION HelloUDF AS ‘org.apache.hadoop.hive.ql.udf.HelloUDF‘;

 OK Time taken: 0.485 seconds

hive>

hive> show functions; 【查看可以看到HelloUDF】

测试

hive>select HelloUDF(‘17‘);

OK

Hello:17

#检查mysql中的元数据,因为是临时函数,故元数据中并没有相关的信息

mysql> select * from funcs;

Empty set (0.11 sec)

删除临时函数 :

  • 语法:DROP TEMPORARY FUNCTION [IF EXISTS] function_name;

测试

hive> DROP TEMPORARY FUNCTION IF EXISTS HelloUDF;

OK

Time taken: 0.003 seconds

hive> select HelloUDF(‘17‘);

FAILED: SemanticException [Error 10011]: Line 1:7 Invalid function ‘HelloUDF‘

##其实不删除也无所谓,重新开一个窗口即可

创建永久函数

  • 语法:
CREATE TEMPORARY FUNCTION function_name AS class_name USING JAR path;

function_name函数名                        

class_name 类路径,

包名+类名 

path jar包hdfs路径

将jar上传到指定目录

[[email protected] hive-1.1.0-cdh5.7.0]$ hadoop fs -mkdir /lib

[[email protected] hive-1.1.0-cdh5.7.0]$ hadoop fs -put /home/hadoop/data/hive/hive_UDF.jar /lib/

[[email protected] ~]$ hadoop fs -mkdir /lib
[[email protected] ~]$ hadoop fs -ls /lib
[[email protected] ~]$ hadoop fs -put ~/lib/g6-hadoop-1.0.jar  /lib/   把本地的jar上传到HDFS的/lib/目录下
[[email protected] ~]$ hadoop fs -ls /lib

创建永久生效的UDF函数

CREATE FUNCTION HelloUDF AS ‘org.apache.hadoop.hive.ql.udf.HelloUDF‘

USING JAR ‘hdfs://hadoop001:9000/lib/g6-hadoop-1.0.jar‘;

#测试 hive> select HelloUDF("17") ;

OK hello:17

检查mysql中的元数据,测试函数的信息已经注册到了元数据中

mysql> select * from funcs;
+---------+------------------------------+-------------+-------+------------+-----------+------------+------------+
| FUNC_ID | CLASS_NAME | CREATE_TIME | DB_ID | FUNC_NAME | FUNC_TYPE | OWNER_NAME | OWNER_TYPE |
+---------+------------------------------+-------------+-------+------------+-----------+------------+------------+
| 1 |org.apache.hadoop.hive.ql.udf.HelloUDF | 1555263915 | 6 | HelloUDF | 1 | NULL | USER |
+---------+------------------------------+-------------+-------+------------+-----------+------------+------------+
  • 创建的永久函数可以在任何一个窗口使用,重新启动函数也照样可以使用

官网参考地址:LanguageManual UDF

原文地址:https://www.cnblogs.com/xuziyu/p/10754592.html

时间: 2024-10-16 06:55:02

hive之UDF函数编程详解的相关文章

Hive的UDF实现详解

Hive自身查询语言HQL能完成大部分的功能,但遇到特殊需求时,需要自己写UDF实现.以下是一个完整的案例. 1.eclipse中编写UDF ①项目中加入hive的lib下的所有jar包和Hadoop中share下hadoop-common-2.5.1.jar(Hadoop目前最新版本2.5.1). ②UDF类要继承org.apache.hadoop.hive.ql.exec.UDF类,类中要实现evaluate. 当我们在hive中使用自定义的UDF的时候,hive会调用类中的evaluate

大数据学习系列之五 ----- Hive整合HBase图文详解

引言 在上一篇 大数据学习系列之四 ----- Hadoop+Hive环境搭建图文详解(单机) 和之前的大数据学习系列之二 ----- HBase环境搭建(单机) 中成功搭建了Hive和HBase的环境,并进行了相应的测试.本文主要讲的是如何将Hive和HBase进行整合. Hive和HBase的通信意图 Hive与HBase整合的实现是利用两者本身对外的API接口互相通信来完成的,其具体工作交由Hive的lib目录中的hive-hbase-handler-*.jar工具类来实现,通信原理如下图

Hive学习之三 《Hive的表的详解和应用案例详解》

一.Hive的表 Hive的表分为内部表.外部表和分区表. 1.内部表,为托管表. 2.外部表,external. 3.分区表. 详解: 内部表,删除表的时候,数据会跟着删除. 外部表,在删除表的时候,数据不会跟着删除. 默认分隔符:列 为 \001         行分隔符为 \n 分区表: 1.解决查询效率,不全表查询,只查对应的分区. 2.避免数据重复的问题,即数据质量方面安全. create table tablename ( 字段1 字段类型 , 字段2 字段类型 ) PARTITIO

Hive安装与配置详解

既然是详解,那么我们就不能只知道怎么安装hive了,下面从hive的基本说起,如果你了解了,那么请直接移步安装与配置 hive是什么 hive安装和配置 hive的测试 hive 这里简单说明一下,好对大家配置hive有点帮助.hive是建立在hadoop上的,当然,你如果只搭建hive也没用什么错.说简单一点,hadoop中的mapreduce调用如果面向DBA的时候,那么问题也就显现了,因为不是每个DBA都能明白mapreduce的工作原理,如果为了管理数据而需要学习一门新的技术,从现实生活

Hive最新数据操作详解(超级详细)

 数据操作能力是大数据分析至关重要的能力.数据操作主要包括:更改(exchange),移动(moving),排序(sorting),转换(transforming).Hive提供了诸多查询语句,关键字,操作和方法来进行数据操作. 一. 数据更改 数据更改主要包括:LOAD, INSERT, IMPORT, and EXPORT 1. LOAD DATA load关键字的作用是将数据移动到hive中.如果是从HDFS加载数据,则加载成功后会删除源数据:如果是从本地加载,则加载成功后不会删除源数

Spark(Hive) SQL数据类型使用详解(Python)

Spark SQL使用时需要有若干“表”的存在,这些“表”可以来自于Hive,也可以来自“临时表”.如果“表”来自于Hive,它的模式(列名.列类型等)在创建时已经确定,一般情况下我们直接通过Spark SQL分析表中的数据即可:如果“表”来自“临时表”,我们就需要考虑两个问题: (1)“临时表”的数据是哪来的? (2)“临时表”的模式是什么? 通过Spark的官方文档可以了解到,生成一张“临时表”需要两个要素: (1)关联着数据的RDD: (2)数据模式: 也就是说,我们需要将数据模式应用于关

大数据学习系列之四 ----- Hadoop+Hive环境搭建图文详解(单机)

引言 在大数据学习系列之一 ----- Hadoop环境搭建(单机) 成功的搭建了Hadoop的环境,在大数据学习系列之二 ----- HBase环境搭建(单机)成功搭建了HBase的环境以及相关使用介绍.本文主要讲解如何搭建Hadoop+Hive的环境. 一.环境准备 1,服务器选择 本地虚拟机 操作系统:linux CentOS 7 Cpu:2核 内存:2G 硬盘:40G 说明:因为使用阿里云服务器每次都要重新配置,而且还要考虑网络传输问题,于是自己在本地便搭建了一个虚拟机,方便文件的传输以

hive操作语句使用详解

#创建表人信息表  person(String name,int age) hive> create table person(name STRING,age INT)ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' ESCAPED BY '\\' STORED AS TEXTFILE; OK Time taken: 0.541 seconds#创建表票价信息表 ticket(int age,float price) hive> create tab

Hive配置项的含义详解

hive.exec.script.maxerrsize:一个map/reduce任务允许打印到标准错误里的最大字节数,为了防止脚本把分区日志填满,默认是100000: hive.exec.script.allow.partial.consumption:hive是否允许脚本不从标准输入中读取任何内容就成功退出,默认关闭false: hive.script.operator.id.env.var:在用户使用transform函数做自定义map/reduce时,存储唯一的脚本标识的环境变量的名字,默