我想计算温度的平均值。然后我创建了一个名为' 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。
答案 0 :(得分:1)
您能效仿官方UDAFExampleAvg.java吗?
我认为您必须进行的唯一调整是在 $('#input1').iCheck({
内部类中使用Double
而不是DoubleWritable
。
另请参阅仅使用原生UDAF's
的示例here。我认为这也会起作用,因为自动装箱/拆箱会发生。