为了满足用户的个性化需求,Hive被设计成了一个很开放的系统,很多内容都可以定制,主要包括:
1)、文件格式;
2)、内存中的数据格式,如Hadoop的Writable/Text;
3)、用户提供的MapReduce脚本,不管使用何种语言都可以通过标准的stdin/stdout传输数据;
4)、用户自定义函数。
本节我们主要学习用户自定义函数。虽然Hive已经提供了很多内存的函数,但是还是不能,满足用户的需求,因此有提供了自定义函数供用户自己开发函数来满足自己的需求。之定义函数主要分三类:
1)、UDF(User-Defined-Function)用户自定义函数,输入一个数据然后产生一个数据;
2)、UDAF(User-Defined Aggregation Function)用户自定义聚合函数,多个输入数据然后产生一个输出参数;
3)、UDTF(User-Defined Table-generating Function)用户自定义表生成函,数,输入一行数据生成N行数据。
UDF
现在我们开始学习如何来开发自己的UDF函数。假设我们现在有一个被保存在littlebigdata.txt文件中的数据集:
edward capriolo,edward@media6degrees.com,2-12-1981,209.191.139.200,M,10
bob,bob@test.net,10-10-2004,10.10.10.1,M,50
sara connor,sara@sky.net,4-5-1974,64.64.5.1,F,2
...
接下来我们顶一个Hive加载这个数据集:
hive> CREATE TABLE IF NOT EXISTS littlebigdata(
> name STRING COMMENT '姓名',
> email STRING COMMENT '邮箱',
> birthday STRING COMMENT '生日',
> ip STRING COMMENT 'ip',
> gender STRING COMMENT '性别',
> anum INT)
> ROW FORMAT DELIMITED FIELDS TERMINATED BY ',';
hive> LOAD DATA LOCAL INPATH '${env:HOME}/littlebigdata.txt'
> INTO TABLE littlebigdata;
我们接下来会写一个自定义的UDF根据数据集中的生日计算对应星座,首先新类要继承
org.apache.hadoop.hive.ql.exec.UDF类,然而UDF类并不是一个抽象类,其中并没有用户自定义函数必须的evaluate()方法,子类必须实现一个或多个evaluate方法给Hive框架调用,这个evaluate方法正是所有实现类的逻辑部分所在,只有用户自己来写方法了:
package org.apache.hadoop.hive.contrib.udf.example;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.apache.hadoop.hive.ql.exec.UDF;
import org.apache.hadoop.hive.ql.exec.Description;
@Description(name = "Zodiac",
value = "FUNC_(date) - from the input data string " +
"or separate month and day arguments,return the sign of the Zodiac.",
extended = "Example:\n >SELECT _FUNC_(date_string) FROM src;\n" +
" > SELECT _FUNC_(month,day) FROM src;")
public class ZodiacSignUDF extends UDF{
private SimpleDateFormat df = null;
/**
* 在默认构造函数中初始化df
*/
public ZodiacSignUDF(){
df = new SimpleDateFormat("MM-dd-yyyy");
}
/**
* 由出生日期获取星座
* @param birthday -Date
* @return
*/
public String evaluate(Date birthday){
return this.evaluate(birthday.getMonth() + 1,birthday.getDay());
}
/**
* 由出生日期获取星座
* @param birthday -String
* @return
*/
public String evaluate(Date birthday){
Date date = null;
try{
date = df.parse(birthday);
}catch(Excetion e){
//如果日期转换失败,就表明星座是未知的
return null;
}
return this.evaluate(date.getMonth() + 1,date.getDay());
}
/**
* 由月份和出生日获取星座
* @param month -int
* @param day -int
* @return
*/
public String evaluate(Integer month,Integer day){
if(month == 1){
if(day < 20){
return "Capricorn";
}else{
return "Aquarius";
}
}else if(month == 2){
if(day < 19){
return "Aquarius";
}else{
return "Pisces";
}
}
/** ... other months here */
return null;
}
}
在HiveQL的执行中,没处理一行都会调用一次ZodiacSignUDF类的实例,然后将每一行的出生一起传给evaluate()方法并得到对应的星座返回给Hive。
那么接下来的问题是如何使用这个自定义函数呢?
首先需要用户便以这个类并将之打成一个jar包,然后将jar文件添加到Hive的classpath并使用CREATE FUNCTION语句将之定义为一个Hive能使用的方法:
hive> ADD JAR /full/path/to/zodiac.jar;
hive> CREATE TEMPORARY FUNCTION zodiac
AS 'org.apache.hadoop.hive.contrib.udf.exampl.ZodiacSignUDF';
当然,上面的函数添加方法只能在Hive session会话期间使用,session结束后如还想使用该函数,那就必须再将上面的两部操作做一遍。如果这个函数是经常使用的,那么这么做就太繁琐了,这种情况下可以把上面的两操作语句添加到$HOME/.hiverc文件中作为全局函数,就想使用hive的内置行是一样:
hive> SELECT name,birthday,zodiac(birthday) FROM littlebigdata;
edward capriolo 2-12-1981 Aquarius
bob 10-10-2004 Libra
sara 4-5-1974 Aries
接着我们来看怎么删除一个·自定义函数:
hive> DROP TEMPORARY FUNCTION IF EXISTS zodiac;
分享到:
相关推荐
hadoop,hive,pig,zookeeper,hbase,hdfs
HIVE编程指南中文版,是由programing hive翻译过来
Hive编程指南中文版翻译,Hive programing
matlab导入excel代码只懂Python的数据科学家的函数式编程 功能编程 历史简介 在1920年代和1930年代,有两种计算理论。 图灵机(艾伦·图灵(Alan Turing),1932年) 基于物理(尽管理论上)机器的逐步计算模型。 ...
编程1 编程的最终评估1
只要它可以帮助正在学习新算法的人,它是否从某个地方复制并不重要。 图形示例也将非常有帮助。 不要忘记包括测试。 不要删除以前的算法实现。 只需使用您自己的实现添加一个新文件。 美化和清理您的代码以便于阅读...
直线-u'jdbc:hive2:// headnodehost:10001 /; transportMode = http'-f demo.hql #this用于将txt文件存储在azure中 直线-u'jdbc:hive2:// headnodehost:10001 /; transportMode = ...
Programing with MFC Programing with MFC
Python-programing:Python代码
The c programing language 经典的C语言著作,被评为“C语言四书五经”之一,深入学习C语言必读。
c++ programingc++ programing and cc++ programing and cc++ programing and cc++ programing and cc++ programing and cc++ programing and cc++ programing and cc++ programing and cc++ programing and cc++ ...
The c programing language
第1章 对象的演化 1 第2章 数据抽象 22 第3章 隐藏实现 42 ...第5章 函数重载与缺省参数 69 第6章 输入输出流介绍 83 第7章 常量 124 第8章 内联函数 142 第9章 命名控制 157 第10章 引用和拷贝构造函数 176
Web-Programing-Assignment:SNU 2021-1 Web编程分配
竞争性编程问题入门JavaScript 要运行js文件,请取消注释必需的软件包。安装依赖项npm install node filename.js Python python filename.py 不Leetcode 等级朗格公司再来1个简单的JavaScript 2个简单的JavaScript 3...
programing in scala中文版的scala教程哦。
1.你用def定义了你的函数定义吗 2.你的函数名只有字符和(下划线) 3.你是否在函数名后面加了一个左括号 5.你是否使每个参数都是唯一的(意味着没有重复的名
Advanced Linux Programing
牛客的代码leetcode代码区别 common_programing programs from niuke
AIX-Programing-Challenge:只需下载并运行以查看输出2的解决方案