我想计算温度的平均值。然后我创建了一个名为“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/