本文探讨了在使用Hive自定义聚合函数(UDAF)处理复杂类型时遇到的错误,主要涉及两种方式。方式1尝试使用tuple类导致运行时出现Class cannot be casted to array的异常;方式2则遇到了类似的ClassCastException,具体为com.hive.customertag.firstLastAmountUDAF$firstLastAmountUDAFEvaluator$Tuple。文章旨在分析并解决这些问题。
摘要由CSDN通过智能技术生成
方式1:
package com.hive.customertag;
import java.util.ArrayList;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.apache.hadoop.hive.ql.metadata.HiveException;
import org.apache.hadoop.hive.ql.parse.SemanticException;
import org.apache.hadoop.hive.ql.udf.generic.AbstractGenericUDAFResolver;
import org.apache.hadoop.hive.ql.udf.generic.GenericUDAFEvaluator;
import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector;
import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspectorFactory;
import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspectorUtils;
import org.apache.hadoop.hive.serde2.objectinspector.PrimitiveObjectInspector;
import org.apache.hadoop.hive.serde2.objectinspector.StandardListObjectInspector;
import org.apache.hadoop.hive.serde2.typeinfo.TypeInfo;
public class firstLastAmountUDAF extends AbstractGenericUDAFResolver {
@Override
public GenericUDAFEvaluator getEvaluator(TypeInfo[] tis)
throws SemanticException
{
return new firstLastAmountUDAFEvaluator();
}
public static class firstLastAmountUDAFEvaluator extends GenericUDAFEvaluator {
private PrimitiveObjectInspector inputOI;
private StandardListObjectInspector loi;
private StandardListObjectInspector internalMergeOI;
private Tuple resultTuple = new Tuple();
private String typeSameDay;
static class ArrayAggregationBuffer implements AggregationBuffer
{
ArrayList<Double> container;
}
@Override
public void reset(AggregationBuffer ab)
throws HiveException
{
((ArrayAggregationBuffer) ab).container = new ArrayList<Double>();
}
@Override
public AggregationBuffer getNewAggregationBuffer()
throws HiveException
{
ArrayAggregationBuffer ret = new ArrayAggregationBuffer();
reset(ret);
return ret;
}
public static class Tuple {
// Caused by: java.lang.NoSuchMethodException: com.hive.prod.udaf.prod_topkUDAF$prod_topkUDAFEvaluator$Tuple.<init>()
public String minCreated;
public double minAmount;
public String maxCreated;
public double maxAmount;
}
public ObjectInspector init(Mode m, ObjectInspector[] parameters)
throws HiveException
{
resultTuple.minCreated="1900-01-01";
super.init(m, parameters);
if (m == Mode.PARTIAL1)
{
inputOI = (PrimitiveObjectInspector) parameters[0];
return ObjectInspectorFactory
.getStandardListObjectInspector((PrimitiveObjectInspector) ObjectInspectorUtils
.getStandardObjectInspector(inputOI));
}
else
{
if (!(parameters[0] instanceof StandardListObjectInspector))
{