背景
业务的指标需求,需要对单个列字段进行特殊处理,得出其中某些有用数据,其中需要对数组进行遍历判断处理,如果使用hive自带的函数处理会比较麻烦,所以使用udf去处理。
pom依赖
我们的集群使用的是cdh集群,所以依赖都是cdh版本
<properties>
<java.source.version>1.8</java.source.version>
<java.target.version>1.8</java.target.version>
<maven.compiler.plugin.version>3.3</maven.compiler.plugin.version>
<file.encoding>UTF-8</file.encoding>
</properties>
<dependencies>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-client</artifactId>
<version>3.0.0-cdh6.1.1</version>
</dependency>
<dependency>
<groupId>org.apache.hive</groupId>
<artifactId>hive-exec</artifactId>
<version>2.1.1-cdh6.1.1</version>
</dependency>
</dependencies>
<build>
<finalName>${project.artifactId}</finalName>
</build>
功能代码
实现获取数组中第一个元素即包含数字又包含字母的元素
public final class OrderFunnelUDF extends UDF {
public String evaluate(List<String> funnelFrom) {
if (null == funnelFrom || funnelFrom.size() == 0) {
return "";
}
String result = "";
for (String index : funnelFrom) {
if (Pattern.compile("[0-9]").matcher(index).find() && Pattern.compile("[a-zA-Z]").matcher(index).find()) {
result = index;
break;
}
}
return result;
}
}
hive 使用
放到hdfs的指定位置,执行add命令
add jar xxx/lib/udf/order_funnel_udf.jar;
创建function
CREATE FUNCTION custom_order_funnel_udf AS 'com.xxx.udf.OrderFunnelUDF' USING JAR 'xxx/lib/udf/order_funnel_udf.jar';
查看function
show functions ;
删除function
DROP FUNCTION custom_order_funnel_udf;
其他操作
当然也可以配置到hive-site.xml实现自动注册UDF函数