java - 如何修复 Hadoop : the Definitive Guide? 中 Hive UDAF 示例的 NoMatchingMethodException

标签 java hadoop hive

我想计算温度的平均值。然后我创建了一个名为“mean”的 UDAF。 我按照书中建议的步骤进行操作并得到了 NoMatchingMethodException。

FAILED: NoMatchingMethodException No matching method for class com.zzy.hadoopbook.hive.Mean with (double). Possible choices: _FUNC_(struct<value:double>)

这是我的 HiveQL:

DROP TABLE IF EXISTS records3;

CREATE TABLE records3 (year STRING, temperature DOUBLE, quality INT)
ROW FORMAT DELIMITED
  FIELDS TERMINATED BY '\t';

LOAD DATA LOCAL INPATH 'input/ncdc/micro-tab/sample.txt'
OVERWRITE INTO TABLE records3;

ADD JAR hive-examples.jar;
CREATE TEMPORARY FUNCTION mean AS 'com.zzy.hadoopbook.hive.Mean';

SELECT mean(temperature) FROM records3;

这是我的 Java 代码:

package com.zzy.hadoopbook.hive;

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

public class Mean extends UDAF {

    public static class MeanDoubleUDAFEvaluator implements UDAFEvaluator {
        public static class PartialResult {
            double sum;
            long count;
        }

        private PartialResult partial;

        @Override
        public void init() {
            partial = null;
        }

        public boolean iterate(DoubleWritable value) {
            if (value == null) {
                return true;
            }
            if (partial == null) {
                partial = new PartialResult();
            }
            partial.sum += value.get();
            partial.count++;
            return true;
        }

        public PartialResult terminatePartial() {
            return partial;
        }

        public boolean merge(PartialResult other) {
            if (other == null) {
                return true;
            }
            if (partial == null) {
                partial = new PartialResult();
            }
            partial.sum += other.sum;
            partial.count += other.count;
            return true;
        }

        public DoubleWritable terminate() {
            if (partial == null) {
                return null;
            }
            return new DoubleWritable(partial.sum / partial.count);
        }
    }
}

我的 Hive jar 版本是 1.2.2。 我的测试集群Hadoop版本是3.1.0,Hive版本是2.3.3。

最佳答案

能不能模仿官方UDAFExampleAvg.java

我认为您唯一需要做的调整是在 UDAF 的 内部类中使用 Double 而不是 DoubleWritable

另见示例 here它只使用原生 double。我认为这也会起作用,因为会发生自动装箱/拆箱。

关于java - 如何修复 Hadoop : the Definitive Guide? 中 Hive UDAF 示例的 NoMatchingMethodException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49814051/

相关文章:

java - 引用对象类型时使用final

java - 使用 Java API 将数据上传到 HDFS

hadoop - 如何控制对 hdfs 的访问?

hadoop - 外壳程序异常java类型java.lang.Integer无法为此数据存储区映射

hadoop - 如何使用外部表和 serde 优化 Hive queires

java - 我的数组中发生了奇怪的事情

java - 心理 bean : Using OR instead of AND to load a list of beans

Java抛出错误 "<Class Name> is not abstract and does not override abstract method in the <Interface>"

database - 存储和解析文本日志和报告的理想系统

hadoop - 配置单元配置hive.stats.fetch.partition.stats不存在