目录
1、udf
2、udaf
3、udtf
4、练习题
详情
1、udf(user defined function)
背景
意义
实现步骤(Java创建自定义UDF类)
代码实现
package com.tianliangedu.hive.udf;
import org.apache.hadoop.hive.ql.exec.UDF;
/*
* 功能:实现当输入字符串超过2个字符的时候,多余的字符以"..."来表示。
* 输入/输出:* 如“12”则返回“12”,如“123”返回“12..."
*/
public class ValueMaskUDF extends UDF{
public String evaluate(String input,int maxSaveStringLength,String replaceSign) {
if(input.length()<=maxSaveStringLength){
return input;
}
return input.substring(0,maxSaveStringLength)+replaceSign;
}
public static void main(String[] args) {
System.out.println(new ValueMaskUDF().evaluate("河北省",2,"..."));;
}
}
布署步骤
打包并上传
<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.0http://maven.apache.org/xsd/maven-4.0.0.xsd";>
<modelVersion>4.0.0modelVersion>
<groupId>com.tianliangedu.coursegroupId>
<artifactId>TlHadoopCoreartifactId>
<version>0.0.1-SNAPSHOTversion>
<repositories>
<repository>
<id>nexus-aliyunid>
<name>Nexus aliyunname>
<url>http://maven.aliyun.com/nexus/content/groups/publicurl>
repository>
repositories>
<dependencies>
<dependency>
<groupId>org.apache.hadoopgroupId>
<artifactId>hadoop-clientartifactId>
<version>2.7.4version>
<scope>providedscope>
dependency>
<dependency>
<groupId>org.apache.hivegroupId>
<artifactId>hive-cliartifactId>
<version>1.2.1version>
<scope>providedscope>
dependency>
dependencies>
<build>
<finalName>TlHadoopCorefinalName>
<plugins>
<plugin>
<artifactId>maven-assembly-pluginartifactId>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependenciesdescriptorRef>
descriptorRefs>
configuration>
<executions>
<execution>
<id>make-assemblyid>
<phase>packagephase>
<goals>
<goal>assemblygoal>
goals>
execution>
executions>
plugin>
<plugin>
<artifactId>maven-compiler-pluginartifactId>
<version>2.3.2version>
<configuration>
<source>1.7source>
<target>1.7target>
<encoding>UTF-8encoding>
configuration>
plugin>
plugins>
build>
project>
maven打包操作
上传jar包至hive操作环境中
rz命令上传至服务器上
加载jar包、声明函数、使用函数
加载jar包
将jar包加入hive 交互中
2、udaf(user defined aggregation function)
自定义udaf函数self_count,实现系统udaf count的功能
Input/Output要求-要解决的问题
实现步骤
自定义一个java类
在hive中执行add jar操作,将jar加载到classpath中。
代码实现
功能要求:实现与hive原生的count相似的计数功能。
如select count(1) from tablename 或者select key,count(1) from tablename group by key;
package com.tianliangedu.hive.udaf;
import org.apache.hadoop.hive.ql.exec.UDAF;
import org.apache.hadoop.hive.ql.exec.UDAFEvaluator;
import org.apache.log4j.Logger;
/**
* 自行实现sql的count操作
*/
//主类继承UDAF
public class DIYCountUDAF extends UDAF {
//日志对象初始化,使访类有输出日志的能力
public static Logger logger=Logger.getLogger(DIYCountUDAF.class);
//静态类实现UDAFEvaluator
public static class Evaluator implements UDAFEvaluator {
//设置成员变量,存储每个统计范围内的总记录数
private int totalRecords;
//初始化函数,map和reduce均会执行该函数,起到初始化所需要的变量的作用
public Evaluator() {
init();
}
//初始化,初始值为0,并日志记录下相应输出
public void init() {
totalRecords = 0;
logger.info("init totalRecords="+totalRecords);
}
//map阶段,返回值为boolean类型,当为true则程序继续执行,当为false则程序退出
public boolean iterate(String input) {
//当input输入不为空的时候,即为有值存在,即为存在1行,故做+1操作
if (input != null) {
totalRecords += 1;
}
//输出当前组处理到第多少条数据了
logger.info("iterate totalRecords="+totalRecords);
return true;
}
/**
* 类似于combiner,在map范围内做部分聚合,将结果传给merge函数中的形参mapOutput
* 如果需要聚合,则对iterator返回的结果处理,否则直接返回iterator的结果即可
*/
public int terminatePartial() {
logger.info("terminatePartial totalRecords="+totalRecords);
return totalRecords;
}
// reduce 阶段,用于逐个迭代处理map当中每个不同key对应的 terminatePartial的结果
public boolean merge(int mapOutput) {
totalRecords +=mapOutput;
logger.info("merge totalRecords="+totalRecords);
return true;
}
//处理merge计算完成后的结果,此时的count在merge完成时候,结果已经得出,无需再进一次对整体结果做处理,故直接返回即可
public int terminate() {
logger.info("terminate totalRecords="+totalRecords);
return totalRecords;
}
}
}
布署步骤
package com.tianliangedu.hive.udaf;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import org.apache.hadoop.hive.ql.exec.UDAF;
import org.apache.hadoop.hive.ql.exec.UDAFEvaluator;
import org.apache.log4j.Logger;
/**
* 实现多条数据合并成一条数据
*/
// 主类继承UDAF
public class StudentScoreAggUDAF extends UDAF {
// 日志对象初始化
public static Logger logger = Logger.getLogger(StudentScoreAggUDAF.class);
// 静态类实现UDAFEvaluator
public static class Evaluator implements UDAFEvaluator {
// 设置成员变量,存储每个统计范围内的总记录数
private Map courseScoreMap;
//初始化函数,map和reduce均会执行该函数,起到初始化所需要的变量的作用
public Evaluator() {
init();
}
// 初始化函数间传递的中间变量
public void init() {
courseScoreMap = new HashMap();
}
//map阶段,返回值为boolean类型,当为true则程序继续执行,当为false则程序退出
public boolean iterate(String course, String score) {
if (course == null || score == null) {
return true;
}
courseScoreMap.put(course, score);
return true;
}
/**
* 类似于combiner,在map范围内做部分聚合,将结果传给merge函数中的形参mapOutput
* 如果需要聚合,则对iterator返回的结果处理,否则直接返回iterator的结果即可
*/
public Map terminatePartial() {
return courseScoreMap;
}
// reduce 阶段,用于逐个迭代处理map当中每个不同key对应的 terminatePartial的结果
public boolean merge(Map mapOutput) {
this.courseScoreMap.putAll(mapOutput);
return true;
}
// 处理merge计算完成后的结果,即对merge完成后的结果做最后的业务处理
public String terminate() {
return courseScoreMap.toString();
}
}
}
* 布署过程与之前相同
* 测试脚本
select id,username,score_agg(course,score) from student_score group by id,username;
3、udtf(User-Defined Table-Generating Functions)
要解决一行输入多行输出的问题,问题的应用场景不少
select id,name,score from test_array lateral view explode(score_array) score_table as score;
select id,mask(name,2,'...'),score from test_array lateral view explode(score_array) score_table as score;
4、练习题
1、实现UDF,实现给定任意明文密码,返回md5加密后32位的密文密码。
001 张三 XXXXXXXXXXXXXXXXX
2、自定义UDAF名字为self_max,求取给定一整数值列表中的最大值函数max功能。
select id,username,max(score) from student_score group by id,username;
3、自定义UDAF名字为self_min,求取给定一整数值列表中的最小值函数min功能。
select id,username,min(score) from student_score group by id,username;
天亮教育是一家从事Java、Hadoop大数据云计算、Python的教育培训、产品开发、咨询服务、人才优选为一体的综合型互联网科技公司。
公司由一批BAT等一线互联网IT精英人士创建,
以”快乐工作,认真生活,打造高端职业技能教育的一面旗帜”为愿景,
胸怀”让天下没有难找的工作”使命,
坚持”客户第一、诚信、激情、拥抱变化”的价值观,
全心全意为学员赋能提效,践行技术改变命运的初心。
欢迎关注天亮教育公众号,大数据技术资料与课程、招生就业动态、教育资讯动态、创业历程分享一站式分享,官方微信公众号二维码:
更多学习讨论, 请加入
官方爬虫、nlp技术qq群320349384
天亮教育官方群318971238,
hadoop & spark & hive技术群297585251,
官网:myhope365.com
官方天亮论坛:http://bbs.myhope365.com/
天亮教育视频链接:http://pan.baidu.com/s/1jIxI4IU 密码:zqa7