Hive中内置了许多常用函数,此外,用户也可以自行编写函数
内置函数
查看系统自带函数
show functions;
显示自带函数的用法与描述
desc function upper; # 查看描述
desc function extended upper; # 查看描述+查看示例
自定义函数 UDF
总体编程步骤:
- 创建maven项目
- 导入hive-exec和hadoop-client,并使用spring的镜像源
- 继承org.apache.hadoop.hive.ql.UDF
- 实现evaluate(),必须有返回值,如果实在没有,返回null。
- 导出项目为jar文件
- 将jar文件导入Hive
- 创建Hive UDF(临时或永久)
创建Maven项目
首先需要在自己的机器上安装Maven,可以参考这里,并配置环境变量。配置好后可以在终端中测试:mvn -version
接着在idea中新建项目,设置构建系统为Maven,JDK为1.8
项目的文件结构像这样:
- HiveUDF/
- src/
- main/
- java/
- resources/
- test/
- java/
- pom.xml
- main/
- src/
导入依赖
pom.xml包含了项目的基本信息, 编辑它
在project标签中添加依赖
<dependencies>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-client</artifactId>
<version>2.9.2</version> <!-- 与服务器Hadoop版本对应 -->
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.apache.hive</groupId>
<artifactId>hive-exec</artifactId>
<version>2.3.9</version> <!-- 与服务器Hive版本对应 -->
<scope>provided</scope>
</dependency>
</dependencies>
并添加spring镜像
<repositories>
<repository>
<id>spring</id>
<url>https://maven.aliyun.com/repository/spring</url>
</repository>
</repositories>
添加完成后Maven-重新加载项目
编写代码
在src/main/java下创建Java包,包名为org.example.hive.udf
在该包下创建类UdfLower
package org.example.hive.udf;
import org.apache.hadoop.hive.ql.exec.UDF;
import org.apache.hadoop.io.Text;
// 继承UDF,并实现evaluate(Text s)
public class UdfLower extends UDF {
public Text evaluate(final Text s) {
if (s == null) {
return null;
}
return new Text(s.toString().toLowerCase());
}
}
导出为Jar文件
首先配置工件:项目结构->项目设置->工件->"+"->JAR->来自具有依赖项的模块->确定
接着进入终端,切换到项目目录,执行mvn compile package
可以看到jar文件已保存到项目目录的target下。将该文件上传至master节点。
创建Hive UDF
jar文件已上传至/root/HiveUDF-1.0-SNAPSHOT.jar
在Hive终端中添加jar包并创建临时函数
add jar /root/HiveUDF-1.0-SNAPSHOT.jar;
create temporary function udf_lower as 'org.example.hive.udf.UdfLower';
使用临时函数
select udf_lower('ABCD'); # abcd
删除临时函数
drop temporary function udf_lower;
如果要创建永久函数,则需要将jar包上传至HDFS
hdfs dfs -mkdir /user/hive/lib
hdfs dfs -put /root/HiveUDF-1.0-SNAPSHOT.jar /user/hive/lib
在Hive终端中添加jar包并创建永久函数
create function perm_lower as 'org.example.hive.udf.UdfLower' using jar 'hdfs://master:9000/user/hive/lib/HiveUDF-1.0-SNAPSHOT.jar';
使用永久函数
select perm_lower('ABCD'); # abcd
删除永久函数
drop function perm_lower;