Details
-
Bug
-
Status: Resolved
-
Minor
-
Resolution: Invalid
-
0.7.0
-
None
-
None
-
Ubuntu 10.10
Description
WritableDoubleObjectInspector throws ClassCastException when I use it in GenericUDF.
I think it is because the type of DoubleWritable is in WritableDoubleObjectInspector is org.apache.hadoop.hive.serde2.io instead of org.apache.hadoop.io.
In WritableDoubleObjectInspector,
org.apache.hadoop.hive.serde2.io.DoubleWritable works fine in GenericUDAF but not in GenericUDF.
Here, it is query and sample code:
select to_double("1234.11") from src;
public class GenericUDFToDouble extends GenericUDF { private ObjectInspectorConverters.Converter[] converters; private ObjectInspector[] argumentOIs; private ObjectInspector returnInspector; @Override public ObjectInspector initialize(ObjectInspector[] arguments) throws UDFArgumentException { converters = new ObjectInspectorConverters.Converter[arguments.length]; for (int i = 0; i < arguments.length; i++) { converters[i] = ObjectInspectorConverters.getConverter(arguments[i], PrimitiveObjectInspectorFactory.writableStringObjectInspector); } argumentOIs = arguments; returnInspector = PrimitiveObjectInspectorFactory.writableDoubleObjectInspector; return returnInspector; } private DoubleWritable doubleResult = new DoubleWritable(); @Override public Object evaluate(DeferredObject[] arguments) throws HiveException { if (arguments[0].get() == null) { return null; } try { Text value1 = (Text) converters[0].convert(arguments[0].get()); doubleResult.set(Double.parseDouble(value1.toString())); return doubleResult; } catch (Exception e) { e.printStackTrace(); return null; } } public String getDisplayString(String[] children) { return "to_double"; } }
Exception trace
===============================
Caused by: java.lang.ClassCastException: org.apache.hadoop.io.DoubleWritable cannot be cast to org.apache.hadoop.hive.serde2.io.DoubleWritable
at org.apache.hadoop.hive.serde2.objectinspector.primitive.WritableDoubleObjectInspector.get(WritableDoubleObjectInspector.java:37)
at org.apache.hadoop.hive.serde2.lazy.LazyUtils.writePrimitiveUTF8(LazyUtils.java:200)
at org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe.serialize(LazySimpleSerDe.java:442)
at org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe.serializeField(LazySimpleSerDe.java:396)
at org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe.serialize(LazySimpleSerDe.java:383)
at org.apache.hadoop.hive.ql.exec.FileSinkOperator.processOp(FileSinkOperator.java:553)
at org.apache.hadoop.hive.ql.exec.Operator.process(Operator.java:471)
at org.apache.hadoop.hive.ql.exec.Operator.forward(Operator.java:744)
at org.apache.hadoop.hive.ql.exec.SelectOperator.processOp(SelectOperator.java:84)
at org.apache.hadoop.hive.ql.exec.Operator.process(Operator.java:471)
at org.apache.hadoop.hive.ql.exec.Operator.forward(Operator.java:744)
at org.apache.hadoop.hive.ql.exec.TableScanOperator.processOp(TableScanOperator.java:78)
at org.apache.hadoop.hive.ql.exec.Operator.process(Operator.java:471)
at org.apache.hadoop.hive.ql.exec.Operator.forward(Operator.java:744)
at org.apache.hadoop.hive.ql.exec.MapOperator.process(MapOperator.java:527)
... 5 more
=======================================