如何在Hadoop中修复Hive UDAF示例的NoMatchingMethodException:权威指南?

时间:2018-04-13 09:48:40

标签: 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。

1 个答案:

答案 0 :(得分:1)

您能效仿官方UDAFExampleAvg.java吗?

我认为您必须进行的唯一调整是在 $('#input1').iCheck({ 内部类中使用Double而不是DoubleWritable

另请参阅仅使用原生UDAF's的示例here。我认为这也会起作用,因为自动装箱/拆箱会发生。