当Hive提供的内置函数不能满足查询需求时,用户可以根据自己业务编写自定义函数(User Defined Functions, UDF), 然后在HiveQL中调用。
例如有这样一个需求:为了保护用户隐私,当查询数据的时候,需要将用户手机号的中间四位用*号代替,比如手机号18001292688需要显示为180****2688。这时候就可以写一个自定义函数实现这个需求。
新建项目MyUDF,添加Maven依赖
<?xml version="1.0" encoding="UTF-8"?>
<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.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>MyUDF</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<hive.version>2.1.1-cdh6.1.0</hive.version>
</properties>
<dependencies>
<dependency>
<groupId>jdk.tools</groupId>
<artifactId>jdk.tools</artifactId>
<version>1.8</version>
<scope>system</scope>
<systemPath>${JAVA_HOME}/lib/tools.jar</systemPath>
</dependency>
<!--Hadoop common包-->
<!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-common -->
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-common</artifactId>
<version>2.10.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.hive/hive-exec -->
<dependency>
<groupId>org.apache.hive</groupId>
<artifactId>hive-exec</artifactId>
<version>${hive.version}</version>
</dependency>
</dependencies>
<!--添加CDH的仓库-->
<repositories>
<repository>
<id>nexus-aliyun</id>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</repository>
<repository>
<id>cloudera</id>
<url>https://repository.cloudera.com/artifactory/cloudera-repos</url>
</repository>
</repositories>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.6.0</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
</build>
</project>
新建类hive.demo.MyUDF
package hive.demo;
import org.apache.hadoop.hive.ql.exec.UDF;
import org.apache.hadoop.io.Text;
/**
* Hive自定义函数类
*/
public class MyUDF extends UDF{
/**
* @param text
* 调用函数时需要传入的参数
* @return 隐藏后的手机号码
* 自定义函数类需要一个名为evaluate()的方法,Hive将调用该方法
*/
public String evaluate(Text text){
String result = "手机号码错误!";
if(text != null && text.getLength() == 11){
String inputStr = text.toString();
StringBuffer sb = new StringBuffer();
sb.append(inputStr.substring(0,3));
sb.append("****");
sb.append(inputStr.substring(7));
result = sb.toString();
}
return result;
}
}
打包MyUDF.jar上传至路径,比如/home/hadoop/
在Hive CLI中执行
hive>add jar /home/hadoop/MyUDF.jar;
创建函数名称
CREATE TEMPORARY FUNCTION formatPhone AS 'hive.demo.MyUDF';
新建一个表测试一下这个自定义的函数
CREATE TABLE t_user(id INT, phone STRING);
INSERT INTO TABLE t_user
SELECT 1, '13123567589'
UNION ALL SELECT 2, '15898705673'
UNION ALL SELECT 3, '18001292688';
文章来源:https://www.toymoban.com/news/detail-837019.html
文章来源地址https://www.toymoban.com/news/detail-837019.html
到了这里,关于Hive UDF的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!