一. UDF
- IO要求-要解决的问题
- in:out=1:1,只能输入一条记录当中的数据,同时返回一条处理结果。
- 属于最常见的自定义函数,像cos,sin,substring,instr等均是如此要求。
- 实现步骤(Java创建自定义UDF类)
- 自定义一个java类
- 继承UDF类
- 约定俗成的重写evaluate方法
- 打包类所在项目成一个all-in-one的jar包并上传到hive所在机器
- 在hive中执行add jar操作,将jar加载到classpath中。
- 在hive中创建模板函数,使得后边可以使用该函数名称调用实际的udf函数
- hive sql中像调用系统函数一样使用udf函数
布署步骤
- maven管理
-
<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.0</modelVersion> <groupId>com.tianliangedu.course</groupId> <artifactId>TlHadoopCore</artifactId> <version>0.0.1-SNAPSHOT</version> <!-- 设置编码为 UTF-8 --> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.encoding>UTF-8</maven.compiler.encoding> </properties> <!-- 首先配置仓库的服务器位置,首选阿里云,也可以配置镜像 --> <repositories> <repository> <id>nexus-aliyun</id> <name>Nexus aliyun</name> <url>http://maven.aliyun.com/nexus/content/groups/public</url> </repository> </repositories> <dependencies> <!-- 引入hadoop-cli-2.7.4依赖 --> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-client</artifactId> <version>2.7.4</version> <scope>provided</scope> </dependency> <dependency> <groupId>org.apache.hive</groupId> <artifactId>hive-cli</artifactId> <version>1.2.1</version> <scope>provided</scope> </dependency> </dependencies> <build> <finalName>TlHadoopCore</finalName> <plugins> <plugin> <artifactId>maven-assembly-plugin</artifactId> <configuration> <descriptorRefs> <descriptorRef>jar-with-dependencies</descriptorRef> </descriptorRefs> </configuration> <executions> <execution> <id>make-assembly</id> <phase>package</phase> <goals> <goal>assembly</goal> </goals> </execution> </executions> </plugin> <plugin> <artifactId>maven-compiler-plugin</artifactId> <version>2.3.2</version> <configuration> <source>1.7</source> <target>1.7</target> <encoding>UTF-8</encoding> </configuration> </plugin> </plugins> </build> </project>
- 上传jar包至hive操作环境中
- 进入到自己的所操作的hive环境目录中。
- 加载jar包、声明函数、使用函数
- 将jar包加入hive 交互中 add jar /home/hive/tianliangedu_course/04_udf/TlHadoopCore-jar-with-dependencies.jar;
- 声明函数 create temporary function mask as 'com.tianliangedu.hive.udf.ValueMaskUDF';
- 使用函数
二. UDAF
- in:out=n:1,即输入N条数据,返回一条处理结果,即列转行。
- 最常见的系统聚合函数,如count,sum,avg,max等
- 实现步骤
- 自定义一个java类
- 继承UDAF类
- 内部定义一个静态类,实现UDAFEvaluator接口
- 实现方法init,iterate,terminatePartial,merge,terminate共5个方法.
- 在hive中执行add jar操作,将jar加载到classpath中。
- 在hive中创建模板函数,使得后边可以使用该函数名称调用实际的udf函数
- hive sql中像调用系统函数一样使用udaf函数
三. UDTF
- 解决一行输入多行输出,即1:n,即行转列应用
- 往往被lateral view explode+udf等替代实现,比直接用udtf会更简单、直接、更灵活一些