This is an automated email from the ASF dual-hosted git repository. dkuzmenko pushed a commit to annotated tag release-4.0.0-alpha-2-rc0 in repository https://gitbox.apache.org/repos/asf/hive.git
commit 512fdf84713a452641fb338839d3ce9f8134d1a8 Author: scarlin-cloudera <[email protected]> AuthorDate: Thu Oct 20 17:40:38 2022 -0700 HIVE-26573: Fix ClassCastException issues for Decimal64 vectorization. (#3630) (cherry picked from commit d3c35ff43d068b46252e0cbd1eafd75c33420183) --- .../hive/ql/exec/vector/VectorDeserializeRow.java | 61 ++++++++-------------- .../hive/ql/exec/vector/TestVectorSerDeRow.java | 52 +++++++++++++++++- .../hive/ql/exec/vector/VectorRandomRowSource.java | 5 +- .../lazy/fast/LazySimpleDeserializeRead.java | 3 -- .../lazybinary/fast/LazyBinaryDeserializeRead.java | 8 +-- .../hive/ql/exec/vector/Decimal64ColumnVector.java | 2 +- .../hive/ql/exec/vector/DecimalColumnVector.java | 2 +- .../hive/ql/exec/vector/IDecimalColumnVector.java | 25 +++++++++ 8 files changed, 104 insertions(+), 54 deletions(-) diff --git a/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/VectorDeserializeRow.java b/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/VectorDeserializeRow.java index 61ed0ce37da..c1f5d8ca32c 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/VectorDeserializeRow.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/VectorDeserializeRow.java @@ -26,7 +26,6 @@ import java.util.List; import org.apache.hadoop.hive.serde2.io.TimestampWritableV2; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.apache.hadoop.hive.common.type.DataTypePhysicalVariation; import org.apache.hadoop.hive.ql.exec.vector.expressions.StringExpr; import org.apache.hadoop.hive.ql.metadata.HiveException; import org.apache.hadoop.hive.ql.plan.VectorPartitionConversion; @@ -87,7 +86,6 @@ public final class VectorDeserializeRow<T extends DeserializeRead> { private T deserializeRead; private TypeInfo[] sourceTypeInfos; - protected DataTypePhysicalVariation[] dataTypePhysicalVariations; private byte[] inputBytes; @@ -99,7 +97,6 @@ public final class VectorDeserializeRow<T extends DeserializeRead> { this(); this.deserializeRead = deserializeRead; sourceTypeInfos = deserializeRead.typeInfos(); - dataTypePhysicalVariations = deserializeRead.getDataTypePhysicalVariations(); } // Not public since we must have the deserialize read object. @@ -115,8 +112,6 @@ public final class VectorDeserializeRow<T extends DeserializeRead> { private PrimitiveCategory primitiveCategory; //The data type primitive category of the column being deserialized. - private DataTypePhysicalVariation dataTypePhysicalVariation; - private int maxLength; // For the CHAR and VARCHAR data types, the maximum character length of // the column. Otherwise, 0. @@ -139,12 +134,11 @@ public final class VectorDeserializeRow<T extends DeserializeRead> { private VectorBatchDeserializer deserializer; - public Field(PrimitiveCategory primitiveCategory, DataTypePhysicalVariation dataTypePhysicalVariation, + public Field(PrimitiveCategory primitiveCategory, int maxLength, VectorBatchDeserializer deserializer) { isPrimitive = true; this.category = Category.PRIMITIVE; this.primitiveCategory = primitiveCategory; - this.dataTypePhysicalVariation = dataTypePhysicalVariation; this.maxLength = maxLength; this.isConvert = false; this.conversionWritable = null; @@ -160,7 +154,6 @@ public final class VectorDeserializeRow<T extends DeserializeRead> { this.category = category; this.objectInspector = TypeInfoUtils.getStandardWritableObjectInspectorFromTypeInfo(typeInfo); this.primitiveCategory = null; - this.dataTypePhysicalVariation = null; this.maxLength = 0; this.isConvert = false; this.conversionWritable = null; @@ -180,10 +173,6 @@ public final class VectorDeserializeRow<T extends DeserializeRead> { return primitiveCategory; } - public DataTypePhysicalVariation getDataTypePhysicalVariation() { - return dataTypePhysicalVariation; - } - public void setMaxLength(int maxLength) { this.maxLength = maxLength; } @@ -253,8 +242,7 @@ public final class VectorDeserializeRow<T extends DeserializeRead> { topLevelFields = new Field[count]; } - private Field allocatePrimitiveField(TypeInfo sourceTypeInfo, - DataTypePhysicalVariation dataTypePhysicalVariation) { + private Field allocatePrimitiveField(TypeInfo sourceTypeInfo) { final PrimitiveTypeInfo sourcePrimitiveTypeInfo = (PrimitiveTypeInfo) sourceTypeInfo; final PrimitiveCategory sourcePrimitiveCategory = sourcePrimitiveTypeInfo.getPrimitiveCategory(); int maxLength = 0; @@ -318,7 +306,7 @@ public final class VectorDeserializeRow<T extends DeserializeRead> { throw new RuntimeException("Primitive category " + sourcePrimitiveCategory + " not supported"); } - return new Field(sourcePrimitiveCategory, dataTypePhysicalVariation, maxLength, deserializer); + return new Field(sourcePrimitiveCategory, maxLength, deserializer); } private Field allocateComplexField(TypeInfo sourceTypeInfo) { @@ -329,7 +317,7 @@ public final class VectorDeserializeRow<T extends DeserializeRead> { final ListTypeInfo listTypeInfo = (ListTypeInfo) sourceTypeInfo; final ListComplexTypeHelper listHelper = new ListComplexTypeHelper( - allocateField(listTypeInfo.getListElementTypeInfo(), DataTypePhysicalVariation.NONE)); + allocateField(listTypeInfo.getListElementTypeInfo())); return new Field(category, listHelper, sourceTypeInfo, new VectorListDeserializer()); } case MAP: @@ -337,8 +325,8 @@ public final class VectorDeserializeRow<T extends DeserializeRead> { final MapTypeInfo mapTypeInfo = (MapTypeInfo) sourceTypeInfo; final MapComplexTypeHelper mapHelper = new MapComplexTypeHelper( - allocateField(mapTypeInfo.getMapKeyTypeInfo(), DataTypePhysicalVariation.NONE), - allocateField(mapTypeInfo.getMapValueTypeInfo(), DataTypePhysicalVariation.NONE)); + allocateField(mapTypeInfo.getMapKeyTypeInfo()), + allocateField(mapTypeInfo.getMapValueTypeInfo())); return new Field(category, mapHelper, sourceTypeInfo, new VectorMapDeserializer()); } case STRUCT: @@ -348,7 +336,7 @@ public final class VectorDeserializeRow<T extends DeserializeRead> { final int count = fieldTypeInfoList.size(); final Field[] fields = new Field[count]; for (int i = 0; i < count; i++) { - fields[i] = allocateField(fieldTypeInfoList.get(i), DataTypePhysicalVariation.NONE); + fields[i] = allocateField(fieldTypeInfoList.get(i)); } final StructComplexTypeHelper structHelper = new StructComplexTypeHelper(fields); @@ -361,7 +349,7 @@ public final class VectorDeserializeRow<T extends DeserializeRead> { final int count = fieldTypeInfoList.size(); final Field[] fields = new Field[count]; for (int i = 0; i < count; i++) { - fields[i] = allocateField(fieldTypeInfoList.get(i), DataTypePhysicalVariation.NONE); + fields[i] = allocateField(fieldTypeInfoList.get(i)); } final UnionComplexTypeHelper unionHelper = new UnionComplexTypeHelper(fields); @@ -372,10 +360,10 @@ public final class VectorDeserializeRow<T extends DeserializeRead> { } } - private Field allocateField(TypeInfo sourceTypeInfo, DataTypePhysicalVariation dataTypePhysicalVariation) { + private Field allocateField(TypeInfo sourceTypeInfo) { switch (sourceTypeInfo.getCategory()) { case PRIMITIVE: - return allocatePrimitiveField(sourceTypeInfo, dataTypePhysicalVariation); + return allocatePrimitiveField(sourceTypeInfo); case LIST: case MAP: case STRUCT: @@ -390,11 +378,11 @@ public final class VectorDeserializeRow<T extends DeserializeRead> { * Initialize one column's source deserializtion information. */ private void initTopLevelField(int logicalColumnIndex, int projectionColumnNum, - TypeInfo sourceTypeInfo, DataTypePhysicalVariation dataTypePhysicalVariation) { + TypeInfo sourceTypeInfo) { projectionColumnNums[logicalColumnIndex] = projectionColumnNum; - topLevelFields[logicalColumnIndex] = allocateField(sourceTypeInfo, dataTypePhysicalVariation); + topLevelFields[logicalColumnIndex] = allocateField(sourceTypeInfo); } /* @@ -434,7 +422,7 @@ public final class VectorDeserializeRow<T extends DeserializeRead> { for (int i = 0; i < count; i++) { int outputColumn = outputColumns[i]; - initTopLevelField(i, outputColumn, sourceTypeInfos[i], dataTypePhysicalVariations[i]); + initTopLevelField(i, outputColumn, sourceTypeInfos[i]); } } @@ -448,7 +436,7 @@ public final class VectorDeserializeRow<T extends DeserializeRead> { for (int i = 0; i < count; i++) { int outputColumn = outputColumns.get(i); - initTopLevelField(i, outputColumn, sourceTypeInfos[i], dataTypePhysicalVariations[i]); + initTopLevelField(i, outputColumn, sourceTypeInfos[i]); } } @@ -462,7 +450,7 @@ public final class VectorDeserializeRow<T extends DeserializeRead> { for (int i = 0; i < count; i++) { int outputColumn = startColumn + i; - initTopLevelField(i, outputColumn, sourceTypeInfos[i], dataTypePhysicalVariations[i]); + initTopLevelField(i, outputColumn, sourceTypeInfos[i]); } } @@ -488,7 +476,7 @@ public final class VectorDeserializeRow<T extends DeserializeRead> { } else { - initTopLevelField(i, i, sourceTypeInfos[i], dataTypePhysicalVariations[i]); + initTopLevelField(i, i, sourceTypeInfos[i]); includedIndices[includedCount++] = i; } } @@ -520,7 +508,7 @@ public final class VectorDeserializeRow<T extends DeserializeRead> { } else { - initTopLevelField(i, outputColumns[i], sourceTypeInfos[i], dataTypePhysicalVariations[i]); + initTopLevelField(i, outputColumns[i], sourceTypeInfos[i]); includedIndices[includedCount++] = i; } } @@ -579,12 +567,12 @@ public final class VectorDeserializeRow<T extends DeserializeRead> { if (VectorPartitionConversion.isImplicitVectorColumnConversion(sourceTypeInfo, targetTypeInfo)) { // Do implicit conversion from source type to target type. - initTopLevelField(i, i, sourceTypeInfo, dataTypePhysicalVariations[i]); + initTopLevelField(i, i, sourceTypeInfo); } else { // Do formal conversion... - initTopLevelField(i, i, sourceTypeInfo, dataTypePhysicalVariations[i]); + initTopLevelField(i, i, sourceTypeInfo); // UNDONE: No for List and Map; Yes for Struct and Union when field count different... addTopLevelConversion(i, targetTypeInfo); @@ -594,7 +582,7 @@ public final class VectorDeserializeRow<T extends DeserializeRead> { } else { // No conversion. - initTopLevelField(i, i, sourceTypeInfo, dataTypePhysicalVariations[i]); + initTopLevelField(i, i, sourceTypeInfo); } @@ -1061,13 +1049,8 @@ public final class VectorDeserializeRow<T extends DeserializeRead> { @Override void store(ColumnVector colVector, Field field, int batchIndex, boolean canRetainByteRef) throws IOException { - if (field.getDataTypePhysicalVariation() == DataTypePhysicalVariation.DECIMAL_64) { - ((Decimal64ColumnVector) colVector).vector[batchIndex] = deserializeRead.currentDecimal64; - } else { - // The DecimalColumnVector set method will quickly copy the deserialized decimal writable fields. - ((DecimalColumnVector) colVector).set( - batchIndex, deserializeRead.currentHiveDecimalWritable); - } + Preconditions.checkState(colVector instanceof IDecimalColumnVector); + ((IDecimalColumnVector) colVector).set(batchIndex, deserializeRead.currentHiveDecimalWritable); } @Override diff --git a/ql/src/test/org/apache/hadoop/hive/ql/exec/vector/TestVectorSerDeRow.java b/ql/src/test/org/apache/hadoop/hive/ql/exec/vector/TestVectorSerDeRow.java index 3af75ee2a0d..dd4021d1ba7 100644 --- a/ql/src/test/org/apache/hadoop/hive/ql/exec/vector/TestVectorSerDeRow.java +++ b/ql/src/test/org/apache/hadoop/hive/ql/exec/vector/TestVectorSerDeRow.java @@ -49,10 +49,12 @@ import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspectorUtils; import org.apache.hadoop.hive.serde2.objectinspector.StructObjectInspector; import org.apache.hadoop.hive.serde2.objectinspector.UnionObject; import org.apache.hadoop.hive.serde2.typeinfo.TypeInfo; +import org.apache.hadoop.hive.serde2.typeinfo.TypeInfoUtils; import org.apache.hadoop.hive.serde2.fast.SerializeWrite; import org.apache.hadoop.hive.serde2.io.HiveCharWritable; import org.apache.hadoop.hive.serde2.io.HiveVarcharWritable; import org.apache.hadoop.io.Text; +import org.apache.hadoop.hive.common.type.DataTypePhysicalVariation; import static org.junit.Assert.fail; @@ -388,19 +390,20 @@ public class TestVectorSerDeRow { } void testVectorDeserializeRow( - Random r, SerializationType serializationType, + Random r, SerializationType serializationType, boolean testDecimal64, boolean alternate1, boolean alternate2, boolean useExternalBuffer) throws HiveException, IOException, SerDeException { for (int i = 0; i < 20; i++) { innerTestVectorDeserializeRow( - r, i,serializationType, alternate1, alternate2, useExternalBuffer); + r, i,serializationType, testDecimal64, alternate1, alternate2, useExternalBuffer); } } void innerTestVectorDeserializeRow( Random r, int iteration, SerializationType serializationType, + boolean testDecimal64, boolean alternate1, boolean alternate2, boolean useExternalBuffer) throws HiveException, IOException, SerDeException { @@ -419,6 +422,22 @@ public class TestVectorSerDeRow { batchContext.init(source.rowStructObjectInspector(), emptyScratchTypeNames); VectorizedRowBatch batch = batchContext.createVectorizedRowBatch(); + // For Decimal64 tests, we manually change the VectorizedRowBatch to contain + // a Decimal64ColumnVector. While this may seem hacky, this is the way that it + // is done within the VectorPTFOperator. + if (testDecimal64) { + for (int i = 0; i < batch.cols.length; ++i) { + if (batch.cols[i] instanceof DecimalColumnVector) { + DecimalColumnVector dcv = (DecimalColumnVector) batch.cols[i]; + if (dcv.precision <= 18) { + String newType = String.format("decimal(%d,%d)", dcv.precision, dcv.scale); + TypeInfo typeInfo = TypeInfoUtils.getTypeInfoFromTypeString(newType); + batch.cols[i] = VectorizedBatchUtil.createColumnVector(typeInfo, DataTypePhysicalVariation.DECIMAL_64); + } + } + } + } + // junk the destination for the 1st pass for (ColumnVector cv : batch.cols) { Arrays.fill(cv.isNull, true); @@ -581,48 +600,56 @@ public class TestVectorSerDeRow { Random r = new Random(8732); testVectorDeserializeRow(r, SerializationType.BINARY_SORTABLE, + /* testDecimal64 */ false, /* alternate1 = useColumnSortOrderIsDesc */ false, /* alternate2 = useBinarySortableCharsNeedingEscape */ false, /* useExternalBuffer */ false); testVectorDeserializeRow(r, SerializationType.BINARY_SORTABLE, + /* testDecimal64 */ false, /* alternate1 = useColumnSortOrderIsDesc */ true, /* alternate2 = useBinarySortableCharsNeedingEscape */ false, /* useExternalBuffer */ false); testVectorDeserializeRow(r, SerializationType.BINARY_SORTABLE, + /* testDecimal64 */ false, /* alternate1 = useColumnSortOrderIsDesc */ false, /* alternate2 = useBinarySortableCharsNeedingEscape */ false, /* useExternalBuffer */ true); testVectorDeserializeRow(r, SerializationType.BINARY_SORTABLE, + /* testDecimal64 */ false, /* alternate1 = useColumnSortOrderIsDesc */ true, /* alternate2 = useBinarySortableCharsNeedingEscape */ false, /* useExternalBuffer */ true); testVectorDeserializeRow(r, SerializationType.BINARY_SORTABLE, + /* testDecimal64 */ false, /* alternate1 = useColumnSortOrderIsDesc */ false, /* alternate2 = useBinarySortableCharsNeedingEscape */ true, /* useExternalBuffer */ false); testVectorDeserializeRow(r, SerializationType.BINARY_SORTABLE, + /* testDecimal64 */ false, /* alternate1 = useColumnSortOrderIsDesc */ true, /* alternate2 = useBinarySortableCharsNeedingEscape */ true, /* useExternalBuffer */ false); testVectorDeserializeRow(r, SerializationType.BINARY_SORTABLE, + /* testDecimal64 */ false, /* alternate1 = useColumnSortOrderIsDesc */ false, /* alternate2 = useBinarySortableCharsNeedingEscape */ true, /* useExternalBuffer */ true); testVectorDeserializeRow(r, SerializationType.BINARY_SORTABLE, + /* testDecimal64 */ false, /* alternate1 = useColumnSortOrderIsDesc */ true, /* alternate2 = useBinarySortableCharsNeedingEscape */ true, /* useExternalBuffer */ true); @@ -633,15 +660,24 @@ public class TestVectorSerDeRow { Random r = new Random(8732); testVectorDeserializeRow(r, SerializationType.LAZY_BINARY, + /* testDecimal64 */ false, /* alternate1 = unused */ false, /* alternate2 = unused */ false, /* useExternalBuffer */ false); testVectorDeserializeRow(r, SerializationType.LAZY_BINARY, + /* testDecimal64 */ false, /* alternate1 = unused */ false, /* alternate2 = unused */ false, /* useExternalBuffer */ true); + + testVectorDeserializeRow(r, + SerializationType.LAZY_BINARY, + /* testDecimal64 */ true, + /* alternate1 = unused */ false, + /* alternate2 = unused */ false, + /* useExternalBuffer */ false); } @Test @@ -649,26 +685,38 @@ public class TestVectorSerDeRow { Random r = new Random(8732); testVectorDeserializeRow(r, SerializationType.LAZY_SIMPLE, + /* testDecimal64 */ false, /* alternate1 = useLazySimpleEscapes */ false, /* alternate2 = unused */ false, /* useExternalBuffer */ false); testVectorDeserializeRow(r, SerializationType.LAZY_SIMPLE, + /* testDecimal64 */ false, /* alternate1 = useLazySimpleEscapes */ false, /* alternate2 = unused */ false, /* useExternalBuffer */ true); testVectorDeserializeRow(r, SerializationType.LAZY_SIMPLE, + /* testDecimal64 */ false, /* alternate1 = useLazySimpleEscapes */ true, /* alternate2 = unused */ false, /* useExternalBuffer */ false); testVectorDeserializeRow(r, SerializationType.LAZY_SIMPLE, + /* testDecimal64 */ false, /* alternate1 = useLazySimpleEscapes */ true, /* alternate2 = unused */ false, /* useExternalBuffer */ true); + + testVectorDeserializeRow(r, + SerializationType.LAZY_SIMPLE, + /* testDecimal64 */ true, + /* alternate1 = useLazySimpleEscapes */ false, + /* alternate2 = unused */ false, + /* useExternalBuffer */ false); + } } diff --git a/ql/src/test/org/apache/hadoop/hive/ql/exec/vector/VectorRandomRowSource.java b/ql/src/test/org/apache/hadoop/hive/ql/exec/vector/VectorRandomRowSource.java index 1b6dbe48d87..c61896532cd 100644 --- a/ql/src/test/org/apache/hadoop/hive/ql/exec/vector/VectorRandomRowSource.java +++ b/ql/src/test/org/apache/hadoop/hive/ql/exec/vector/VectorRandomRowSource.java @@ -377,7 +377,8 @@ public class VectorRandomRowSource { "timestamp", "interval_year_month", "interval_day_time", - "decimal" + "decimal", + "decimal64" }; private static String[] possibleHiveComplexTypeNames = { @@ -434,6 +435,8 @@ public class VectorRandomRowSource { "decimal(%d,%d)", HiveDecimal.SYSTEM_DEFAULT_PRECISION, HiveDecimal.SYSTEM_DEFAULT_SCALE); + } else if (typeName.equals("decimal64")) { + typeName = "decimal(18,6)"; } else if (typeName.equals("array")) { String elementTypeName = getRandomTypeName(random, supportedTypes, allowedTypeNameSet); elementTypeName = diff --git a/serde/src/java/org/apache/hadoop/hive/serde2/lazy/fast/LazySimpleDeserializeRead.java b/serde/src/java/org/apache/hadoop/hive/serde2/lazy/fast/LazySimpleDeserializeRead.java index ac710578eea..34e5a4a9baf 100644 --- a/serde/src/java/org/apache/hadoop/hive/serde2/lazy/fast/LazySimpleDeserializeRead.java +++ b/serde/src/java/org/apache/hadoop/hive/serde2/lazy/fast/LazySimpleDeserializeRead.java @@ -855,9 +855,6 @@ public final class LazySimpleDeserializeRead extends DeserializeRead { decimalIsNull = !currentHiveDecimalWritable.mutateEnforcePrecisionScale(precision, scale); if (!decimalIsNull) { - if (HiveDecimalWritable.isPrecisionDecimal64(precision)) { - currentDecimal64 = currentHiveDecimalWritable.serialize64(scale); - } return true; } } diff --git a/serde/src/java/org/apache/hadoop/hive/serde2/lazybinary/fast/LazyBinaryDeserializeRead.java b/serde/src/java/org/apache/hadoop/hive/serde2/lazybinary/fast/LazyBinaryDeserializeRead.java index 53af41be65c..8a737a4c68b 100644 --- a/serde/src/java/org/apache/hadoop/hive/serde2/lazybinary/fast/LazyBinaryDeserializeRead.java +++ b/serde/src/java/org/apache/hadoop/hive/serde2/lazybinary/fast/LazyBinaryDeserializeRead.java @@ -397,17 +397,11 @@ public final class LazyBinaryDeserializeRead extends DeserializeRead { decimalIsNull = !currentHiveDecimalWritable.mutateEnforcePrecisionScale(precision, scale); if (!decimalIsNull) { - if (HiveDecimalWritable.isPrecisionDecimal64(precision)) { - currentDecimal64 = currentHiveDecimalWritable.serialize64(scale); - } return true; } } - if (decimalIsNull) { - return false; - } + return false; } - break; default: throw new Error("Unexpected primitive category " + primitiveCategory.name()); } diff --git a/storage-api/src/java/org/apache/hadoop/hive/ql/exec/vector/Decimal64ColumnVector.java b/storage-api/src/java/org/apache/hadoop/hive/ql/exec/vector/Decimal64ColumnVector.java index 615eb6fcf71..7f47b905f24 100644 --- a/storage-api/src/java/org/apache/hadoop/hive/ql/exec/vector/Decimal64ColumnVector.java +++ b/storage-api/src/java/org/apache/hadoop/hive/ql/exec/vector/Decimal64ColumnVector.java @@ -23,7 +23,7 @@ import org.apache.hadoop.hive.serde2.io.HiveDecimalWritable; /** */ -public class Decimal64ColumnVector extends LongColumnVector { +public class Decimal64ColumnVector extends LongColumnVector implements IDecimalColumnVector { public short scale; public short precision; diff --git a/storage-api/src/java/org/apache/hadoop/hive/ql/exec/vector/DecimalColumnVector.java b/storage-api/src/java/org/apache/hadoop/hive/ql/exec/vector/DecimalColumnVector.java index e074fb91738..5defd27623b 100644 --- a/storage-api/src/java/org/apache/hadoop/hive/ql/exec/vector/DecimalColumnVector.java +++ b/storage-api/src/java/org/apache/hadoop/hive/ql/exec/vector/DecimalColumnVector.java @@ -24,7 +24,7 @@ import java.util.Arrays; import org.apache.hadoop.hive.serde2.io.HiveDecimalWritable; import org.apache.hadoop.hive.common.type.HiveDecimal; -public class DecimalColumnVector extends ColumnVector { +public class DecimalColumnVector extends ColumnVector implements IDecimalColumnVector { /** * A vector of HiveDecimalWritable objects. diff --git a/storage-api/src/java/org/apache/hadoop/hive/ql/exec/vector/IDecimalColumnVector.java b/storage-api/src/java/org/apache/hadoop/hive/ql/exec/vector/IDecimalColumnVector.java new file mode 100644 index 00000000000..eedc0ee62f4 --- /dev/null +++ b/storage-api/src/java/org/apache/hadoop/hive/ql/exec/vector/IDecimalColumnVector.java @@ -0,0 +1,25 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.hadoop.hive.ql.exec.vector; + +import org.apache.hadoop.hive.serde2.io.HiveDecimalWritable; + +public interface IDecimalColumnVector { + void set(int elementNum, HiveDecimalWritable writable); +}
