Hive 使用UDF

53 阅读1分钟

背景

业务的指标需求,需要对单个列字段进行特殊处理,得出其中某些有用数据,其中需要对数组进行遍历判断处理,如果使用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函数