Hive中内置了许多常用函数,此外,用户也可以自行编写函数

内置函数

查看系统自带函数

show functions;

显示自带函数的用法与描述

desc function upper;          # 查看描述
desc function extended upper; # 查看描述+查看示例

desc

descex

自定义函数 UDF

总体编程步骤:

  1. 创建maven项目
  2. 导入hive-exec和hadoop-client,并使用spring的镜像源
  3. 继承org.apache.hadoop.hive.ql.UDF
  4. 实现evaluate(),必须有返回值,如果实在没有,返回null。
  5. 导出项目为jar文件
  6. 将jar文件导入Hive
  7. 创建Hive UDF(临时或永久)
创建Maven项目

首先需要在自己的机器上安装Maven,可以参考这里,并配置环境变量。配置好后可以在终端中测试:mvn -version mvn

接着在idea中新建项目,设置构建系统为Maven,JDK为1.8 new

项目的文件结构像这样:

  • HiveUDF/
    • src/
      • main/
        • java/
        • resources/
      • test/
        • java/
      • pom.xml
导入依赖

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->来自具有依赖项的模块->确定 artifact

接着进入终端,切换到项目目录,执行mvn compile package compile

可以看到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

select

删除临时函数

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

select

删除永久函数

drop function perm_lower;