hive udf简单示例

hive udf简单示例

udaf

Kurt


import org.apache.commons.math3.stat.descriptive.moment.Kurtosis;
import org.apache.hadoop.hive.ql.exec.UDAF;
import org.apache.hadoop.hive.ql.exec.UDAFEvaluator;
import org.apache.hadoop.io.DoubleWritable;
import org.apache.hadoop.io.LongWritable;

import java.util.*;

public class Kurt extends UDAF {
    private static Kurtosis kurtosis = new Kurtosis();

    public static class KurtEvaluatorLong implements UDAFEvaluator {
        private static List<LongWritable> state;

        public KurtEvaluatorLong() {
            super();
            state = new ArrayList<>();
            init();
        }

        /**
         * init函数类似于构造函数,用于UDAF的初始化
         */
        public void init() {
            state.clear();
        }

        /**
         * 迭代处理原始数据的一行。
         *
         * 参数的数量和类型需要与我们从Hive命令行调用这个UDAF相同。
         *
         * 这个函数应该总是返回true。
         *
         * @param o
         * @return
         */
        public boolean iterate(LongWritable o) {
            if (o != null) {
                state.add(o);
            }
            return true;
        }

        /**
         * 终止部分聚合并返回状态。如果状态是原语,就返回原语Java类,如Integer或String。
         *
         * @return
         */
        public List<LongWritable> terminatePartial() {
            // combiner
            return state.size() == 0 ? null : state;
        }

        /**
         * 与部分状态合并
         *
         * 这个函数应该始终有一个参数,该参数的类型与terminatePartial()的返回值相同。
         *
         * @param o
         * @return
         */

        public boolean merge(List<LongWritable> o) {
            if (o.size() != 0) {
                state.addAll(o);
            }
            return true;
        }

        /**
         * 终止聚合并返回最终结果。
         *
         * @return
         */
        public Double terminate() {

            if (state.size() == 0) {
                return null;
            } else {
                double[] lon = new double[state.size()];
                for (int i = 0; i < state.size(); i++) {
                    lon[i] = Double.parseDouble(state.get(i).toString());
                }
                return kurtosis.evaluate(lon);
            }
        }
    }

    public static class KurtEvaluatorDouble implements UDAFEvaluator {
        private static List<DoubleWritable> state;

        public KurtEvaluatorDouble() {
            super();
            state = new ArrayList<>();
            init();
        }

        /**
         * init函数类似于构造函数,用于UDAF的初始化
         */
        public void init() {
            state.clear();
        }

        /**
         * 迭代处理原始数据的一行。
         * <p>
         * 参数的数量和类型需要与我们从Hive命令行调用这个UDAF相同。
         * <p>
         * 这个函数应该总是返回true。
         *
         * @param o
         * @return
         */
        public boolean iterate(DoubleWritable o) {
            if (o != null) {
                state.add(o);
            }
            return true;
        }

        /**
         * 终止部分聚合并返回状态。如果状态是原语,就返回原语Java类,如Integer或String。
         *
         * @return
         */
        public List<DoubleWritable> terminatePartial() {
            // combiner
            return state.size() == 0 ? null : state;
        }

        /**
         * 与部分状态合并
         * <p>
         * 这个函数应该始终有一个参数,该参数的类型与terminatePartial()的返回值相同。
         *
         * @param o
         * @return
         */

        public boolean merge(List<DoubleWritable> o) {
            if (o.size() != 0) {
                state.addAll(o);
            }
            return true;
        }

        /**
         * 终止聚合并返回最终结果。
         *
         * @return
         */
        public Double terminate() {

            if (state.size() == 0) {
                return null;
            } else {
                double[] lon = new double[state.size()];
                for (int i = 0; i < state.size(); i++) {
                    lon[i] = Double.parseDouble(state.get(i).toString());
                }
                return kurtosis.evaluate(lon);
            }
        }
    }
//{"value":-1.1992118504785885}
}

Mode


import org.apache.hadoop.hive.ql.exec.UDAF;
import org.apache.hadoop.hive.ql.exec.UDAFEvaluator;
import org.apache.hadoop.io.DoubleWritable;
import org.apache.hadoop.io.LongWritable;

import java.util.*;

public class Mode extends UDAF {

    /**
     * 执行实际类。Hive将自动查找实现UDAFEvaluator的UDAF的所有内部类。
     */
    public static class ModeEvaluatorLong implements UDAFEvaluator {
        Map<Long, Long> stats;
        List<Long> list;
        Long maxNum;

        public ModeEvaluatorLong() {
            super();
            stats = new HashMap<>();
            list = new ArrayList<>();
            init();
        }

        /**
         * init函数类似于构造函数,用于UDAF的初始化
         */
        public void init() {
            stats.clear();
            list.clear();
            maxNum = new Long(0);
        }

        /**
         * 迭代处理原始数据的一行。
         *
         * 参数的数量和类型需要与我们从Hive命令行调用这个UDAF相同。
         *
         * 这个函数应该总是返回true。
         *
         * @param o
         * @return
         */
        public boolean iterate(LongWritable o) {
            if (o != null) {
                // 统计输入列每个元素的数量
                if (stats.containsKey(o.get())) {
                    stats.put(o.get(), stats.get(o.get()) + 1);
                } else {
                    stats.put(o.get(), new Long(1));
                }
            }
            return true;
        }

        /**
         * 终止部分聚合并返回状态。如果状态是原语,就返回原语Java类,如Integer或String。
         * @return
         */
        public Map<Long, Long> terminatePartial() {
            // combiner
            return stats.size() == 0 ? null : stats;
        }

        /**
         * 与部分状态合并
         *
         * 这个函数应该始终有一个参数,该参数的类型与terminatePartial()的返回值相同。
         * @param o
         * @return
         */

        public boolean merge(Map<Long, Long> o) {
            if (o.size() != 0) {
                Iterator<Long> iterable = o.keySet().iterator();
                while (iterable.hasNext()) {
                    Long key = iterable.next();
                    if (this.stats.containsKey(key)) {
                        this.stats.put(key,o.get(key)+stats.get(key));
                    }else {
                        this.stats.put(key, o.get(key));
                    }
                }
            }
            return true;
        }

        /**
         * 终止聚合并返回最终结果。
         * @return
         */
        public List<Long> terminate() {

            if (stats.size() == 0) {
                return null;
            } else {
                Iterator<Long> iterator = stats.keySet().iterator();
                while (iterator.hasNext()) {
                    Long key = iterator.next();
                    Long sv = stats.get(key);
                    if (sv > maxNum) {//初始化
                        maxNum = sv;
                        list.clear();
                        list.add(key);
                    } else if (sv == maxNum) {
                        list.add(key);
                    }
                }
            }
            return list;
        }
    }

    public static class ModeEvaluatorDouble implements UDAFEvaluator {
        Map<Double, Long> stats;
        List<Double> list;
        Long maxNum;

        public ModeEvaluatorDouble() {
            super();
            stats = new HashMap<>();
            list = new ArrayList<>();
            init();
        }

        public void init() {
            stats.clear();
            list.clear();
            maxNum = new Long(0);
        }

        public boolean iterate(DoubleWritable o) {
            if (o != null) {
                // 统计输入列每个元素的数量
                if (stats.containsKey(o.get())) {
                    stats.put(o.get(), stats.get(o.get()) + 1);
                } else {
                    stats.put(o.get(), new Long(1));
                }
            }
            return true;
        }

        public Map<Double, Long> terminatePartial() {
            // combiner
            return stats.size() == 0 ? null : stats;
        }

        public boolean merge(Map<Double, Long> o) {
            if (o.size() != 0) {
                Iterator<Double> iterable = o.keySet().iterator();
                while (iterable.hasNext()) {
                    Double key = iterable.next();
                    if (this.stats.containsKey(key)) {
                        this.stats.put(key,o.get(key)+stats.get(key));
                    }else {
                        this.stats.put(key, o.get(key));
                    }
                }
            }
            return true;
        }

        public List<Double> terminate() {

            if (stats.size() == 0) {
                return null;
            } else {
                Iterator<Double> iterator = stats.keySet().iterator();
                while (iterator.hasNext()) {
                    Double key = iterator.next();
                    Long sv = stats.get(key);
                    if (sv > maxNum) {//初始化
                        maxNum = sv;
                        list.clear();
                        list.add(key);
                    } else if (sv == maxNum) {
                        list.add(key);
                    }
                }
            }
            return list;
        }
    }
}

Skew


import org.apache.commons.math3.stat.descriptive.moment.Skewness;
import org.apache.hadoop.hive.ql.exec.UDAF;
import org.apache.hadoop.hive.ql.exec.UDAFEvaluator;
import org.apache.hadoop.io.DoubleWritable;
import org.apache.hadoop.io.LongWritable;

import java.util.ArrayList;
import java.util.List;

public class Skew extends UDAF {
    private static Skewness skewness = new Skewness();

    public static class SkewEvaluatorLong implements UDAFEvaluator {
        private static List<LongWritable> state;

        public SkewEvaluatorLong() {
            super();
            state = new ArrayList<>();
            init();
        }

        /**
         * init函数类似于构造函数,用于UDAF的初始化
         */
        public void init() {
            state.clear();
        }

        /**
         * 迭代处理原始数据的一行。
         * 参数的数量和类型需要与我们从Hive命令行调用这个UDAF相同。
         * 这个函数应该总是返回true。
         *
         * @param o
         * @return
         */
        public boolean iterate(LongWritable o) {
            if (o != null) {
                state.add(o);
            }
            return true;
        }

        /**
         * 终止部分聚合并返回状态。如果状态是原语,就返回原语Java类,如Integer或String。
         *
         * @return
         */
        public List<LongWritable> terminatePartial() {
            // combiner
            return state.size() == 0 ? null : state;
        }

        /**
         * 与部分状态合并
         * <p>
         * 这个函数应该始终有一个参数,该参数的类型与terminatePartial()的返回值相同。
         *
         * @param o
         * @return
         */

        public boolean merge(List<LongWritable> o) {
            if (o.size() != 0) {
                state.addAll(o);
            }
            return true;
        }

        /**
         * 终止聚合并返回最终结果。
         *
         * @return
         */
        public Double terminate() {

            if (state.size() == 0) {
                return null;
            } else {
                double[] lon = new double[state.size()];
                for (int i = 0; i < state.size(); i++) {
                    lon[i] = Double.parseDouble(state.get(i).toString());
                }
                return skewness.evaluate(lon);
            }
        }
    }

    public static class SkewEvaluatorDouble implements UDAFEvaluator {
        private static List<DoubleWritable> state;

        public SkewEvaluatorDouble() {
            super();
            state = new ArrayList<>();
            init();
        }

        /**
         * init函数类似于构造函数,用于UDAF的初始化
         */
        public void init() {
            state.clear();
        }

        /**
         * 迭代处理原始数据的一行。
         * <p>
         * 参数的数量和类型需要与我们从Hive命令行调用这个UDAF相同。
         * <p>
         * 这个函数应该总是返回true。
         *
         * @param o
         * @return
         */
        public boolean iterate(DoubleWritable o) {
            if (o != null) {
                state.add(o);
            }
            return true;
        }

        /**
         * 终止部分聚合并返回状态。如果状态是原语,就返回原语Java类,如Integer或String。
         *
         * @return
         */
        public List<DoubleWritable> terminatePartial() {
            // combiner
            return state.size() == 0 ? null : state;
        }

        /**
         * 与部分状态合并
         * <p>
         * 这个函数应该始终有一个参数,该参数的类型与terminatePartial()的返回值相同。
         *
         * @param o
         * @return
         */

        public boolean merge(List<DoubleWritable> o) {
            if (o.size() != 0) {
                state.addAll(o);
            }
            return true;
        }

        /**
         * 终止聚合并返回最终结果。
         *
         * @return
         */
        public Double terminate() {

            if (state.size() == 0) {
                return null;
            } else {
                double[] lon = new double[state.size()];
                for (int i = 0; i < state.size(); i++) {
                    lon[i] = Double.parseDouble(state.get(i).toString());
                }
                return skewness.evaluate(lon);
            }
        }
    }
}

部分依赖

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
        <hadoop.version>3.0.0</hadoop.version>
        <hive.version>2.1.1</hive.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.apache.hive</groupId>
            <artifactId>hive-exec</artifactId>
            <version>${hive.version}</version>
            <exclusions>
                <exclusion>
                    <groupId>org.apache.logging.log4j</groupId>
                    <artifactId>log4j-1.2-api</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>org.apache.logging.log4j</groupId>
                    <artifactId>log4j-slf4j-impl</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-client</artifactId>
            <version>${hadoop.version}</version>
            <exclusions>
                <exclusion>
                    <groupId>org.slf4j</groupId>
                    <artifactId>slf4j-log4j12</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>org.apache.logging.log4j</groupId>
                    <artifactId>log4j-1.2-api</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>org.slf4j</groupId>
                    <artifactId>slf4j-api</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>org.apache.logging.log4j</groupId>
                    <artifactId>log4j-slf4j-impl</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-common</artifactId>
            <version>${hadoop.version}</version>
            <exclusions>
                <exclusion>
                    <groupId>org.apache.logging.log4j</groupId>
                    <artifactId>log4j-1.2-api</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>org.slf4j</groupId>
                    <artifactId>slf4j-api</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>org.slf4j</groupId>
                    <artifactId>slf4j-log4j12</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-hdfs</artifactId>
            <version>${hadoop.version}</version>
            <exclusions>
                <exclusion>
                    <groupId>net.minidev</groupId>
                    <artifactId>json-smart</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>org.apache.logging.log4j</groupId>
                    <artifactId>log4j-1.2-api</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>org.apache.logging.log4j</groupId>
                    <artifactId>log4j-slf4j-impl</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>org.slf4j</groupId>
                    <artifactId>slf4j-api</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.slf4j</groupId>
                    <artifactId>slf4j-log4j12</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>org.slf4j</groupId>
                    <artifactId>slf4j-api</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-simple</artifactId>
            <version>1.7.25</version>
            <scope>compile</scope>
        </dependency>
    </dependencies>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值