aboutsummaryrefslogtreecommitdiff
path: root/contrib/storage-hive/core/src/main/java/org/apache/drill/exec/store/hive/HiveFieldConverter.java
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/storage-hive/core/src/main/java/org/apache/drill/exec/store/hive/HiveFieldConverter.java')
-rw-r--r--contrib/storage-hive/core/src/main/java/org/apache/drill/exec/store/hive/HiveFieldConverter.java112
1 files changed, 14 insertions, 98 deletions
diff --git a/contrib/storage-hive/core/src/main/java/org/apache/drill/exec/store/hive/HiveFieldConverter.java b/contrib/storage-hive/core/src/main/java/org/apache/drill/exec/store/hive/HiveFieldConverter.java
index 2fab5a4d4..6caecbb82 100644
--- a/contrib/storage-hive/core/src/main/java/org/apache/drill/exec/store/hive/HiveFieldConverter.java
+++ b/contrib/storage-hive/core/src/main/java/org/apache/drill/exec/store/hive/HiveFieldConverter.java
@@ -17,27 +17,19 @@
*/
package org.apache.drill.exec.store.hive;
+import java.math.RoundingMode;
import java.util.Map;
-import org.apache.drill.exec.expr.holders.Decimal18Holder;
-import org.apache.drill.exec.expr.holders.Decimal28SparseHolder;
-import org.apache.drill.exec.expr.holders.Decimal38SparseHolder;
-import org.apache.drill.exec.expr.holders.Decimal9Holder;
-import org.apache.drill.exec.ops.FragmentContext;
-import org.apache.drill.exec.util.DecimalUtility;
import org.apache.drill.exec.vector.NullableBigIntVector;
import org.apache.drill.exec.vector.NullableBitVector;
import org.apache.drill.exec.vector.NullableDateVector;
-import org.apache.drill.exec.vector.NullableDecimal18Vector;
-import org.apache.drill.exec.vector.NullableDecimal28SparseVector;
-import org.apache.drill.exec.vector.NullableDecimal38SparseVector;
-import org.apache.drill.exec.vector.NullableDecimal9Vector;
import org.apache.drill.exec.vector.NullableFloat4Vector;
import org.apache.drill.exec.vector.NullableFloat8Vector;
import org.apache.drill.exec.vector.NullableIntVector;
import org.apache.drill.exec.vector.NullableTimeStampVector;
import org.apache.drill.exec.vector.NullableVarBinaryVector;
import org.apache.drill.exec.vector.NullableVarCharVector;
+import org.apache.drill.exec.vector.NullableVarDecimalVector;
import org.apache.drill.exec.vector.ValueVector;
import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector;
import org.apache.hadoop.hive.serde2.objectinspector.PrimitiveObjectInspector.PrimitiveCategory;
@@ -55,7 +47,6 @@ import org.apache.hadoop.hive.serde2.objectinspector.primitive.LongObjectInspect
import org.apache.hadoop.hive.serde2.objectinspector.primitive.ShortObjectInspector;
import org.apache.hadoop.hive.serde2.objectinspector.primitive.StringObjectInspector;
import org.apache.hadoop.hive.serde2.objectinspector.primitive.TimestampObjectInspector;
-import org.apache.hadoop.hive.serde2.typeinfo.DecimalTypeInfo;
import org.apache.hadoop.hive.serde2.typeinfo.PrimitiveTypeInfo;
import org.apache.hadoop.hive.serde2.typeinfo.TypeInfo;
import org.apache.hadoop.io.Text;
@@ -92,33 +83,18 @@ public abstract class HiveFieldConverter {
primMap.put(PrimitiveCategory.TIMESTAMP, Timestamp.class);
primMap.put(PrimitiveCategory.DATE, Date.class);
primMap.put(PrimitiveCategory.CHAR, Char.class);
+ primMap.put(PrimitiveCategory.DECIMAL, VarDecimal.class);
}
- public static HiveFieldConverter create(TypeInfo typeInfo, FragmentContext fragmentContext)
+ public static HiveFieldConverter create(TypeInfo typeInfo)
throws IllegalAccessException, InstantiationException {
switch (typeInfo.getCategory()) {
case PRIMITIVE:
final PrimitiveCategory pCat = ((PrimitiveTypeInfo) typeInfo).getPrimitiveCategory();
- if (pCat != PrimitiveCategory.DECIMAL) {
- Class<? extends HiveFieldConverter> clazz = primMap.get(pCat);
- if (clazz != null) {
- return clazz.newInstance();
- }
- } else {
- // For decimal, based on precision return appropriate converter.
- DecimalTypeInfo decimalTypeInfo = (DecimalTypeInfo) typeInfo;
- int precision = decimalTypeInfo.precision();
- int scale = decimalTypeInfo.scale();
- if (precision <= 9) {
- return new Decimal9(precision, scale);
- } else if (precision <= 18) {
- return new Decimal18(precision, scale);
- } else if (precision <= 28) {
- return new Decimal28(precision, scale, fragmentContext);
- } else {
- return new Decimal38(precision, scale, fragmentContext);
- }
+ Class<? extends HiveFieldConverter> clazz = primMap.get(pCat);
+ if (clazz != null) {
+ return clazz.newInstance();
}
throwUnsupportedHiveDataTypeError(pCat.toString());
@@ -151,75 +127,15 @@ public abstract class HiveFieldConverter {
}
}
- public static class Decimal9 extends HiveFieldConverter {
- private final Decimal9Holder holder = new Decimal9Holder();
-
- public Decimal9(int precision, int scale) {
- holder.scale = scale;
- holder.precision = precision;
- }
-
- @Override
- public void setSafeValue(ObjectInspector oi, Object hiveFieldValue, ValueVector outputVV, int outputIndex) {
- holder.value = DecimalUtility.getDecimal9FromBigDecimal(
- ((HiveDecimalObjectInspector)oi).getPrimitiveJavaObject(hiveFieldValue).bigDecimalValue(),
- holder.scale, holder.precision);
- ((NullableDecimal9Vector) outputVV).getMutator().setSafe(outputIndex, holder);
- }
- }
-
- public static class Decimal18 extends HiveFieldConverter {
- private final Decimal18Holder holder = new Decimal18Holder();
-
- public Decimal18(int precision, int scale) {
- holder.scale = scale;
- holder.precision = precision;
- }
-
- @Override
- public void setSafeValue(ObjectInspector oi, Object hiveFieldValue, ValueVector outputVV, int outputIndex) {
- holder.value = DecimalUtility.getDecimal18FromBigDecimal(
- ((HiveDecimalObjectInspector)oi).getPrimitiveJavaObject(hiveFieldValue).bigDecimalValue(),
- holder.scale, holder.precision);
- ((NullableDecimal18Vector) outputVV).getMutator().setSafe(outputIndex, holder);
- }
- }
-
- public static class Decimal28 extends HiveFieldConverter {
- private final Decimal28SparseHolder holder = new Decimal28SparseHolder();
-
- public Decimal28(int precision, int scale, FragmentContext context) {
- holder.scale = scale;
- holder.precision = precision;
- holder.buffer = context.getManagedBuffer(Decimal28SparseHolder.nDecimalDigits * DecimalUtility.INTEGER_SIZE);
- holder.start = 0;
- }
-
- @Override
- public void setSafeValue(ObjectInspector oi, Object hiveFieldValue, ValueVector outputVV, int outputIndex) {
- DecimalUtility.getSparseFromBigDecimal(
- ((HiveDecimalObjectInspector)oi).getPrimitiveJavaObject(hiveFieldValue).bigDecimalValue(),
- holder.buffer, holder.start, holder.scale, holder.precision, Decimal28SparseHolder.nDecimalDigits);
- ((NullableDecimal28SparseVector) outputVV).getMutator().setSafe(outputIndex, holder);
- }
- }
-
- public static class Decimal38 extends HiveFieldConverter {
- private final Decimal38SparseHolder holder = new Decimal38SparseHolder();
-
- public Decimal38(int precision, int scale, FragmentContext context) {
- holder.scale = scale;
- holder.precision = precision;
- holder.buffer = context.getManagedBuffer(Decimal38SparseHolder.nDecimalDigits * DecimalUtility.INTEGER_SIZE);
- holder.start = 0;
- }
-
+ public static class VarDecimal extends HiveFieldConverter {
@Override
public void setSafeValue(ObjectInspector oi, Object hiveFieldValue, ValueVector outputVV, int outputIndex) {
- DecimalUtility.getSparseFromBigDecimal(
- ((HiveDecimalObjectInspector)oi).getPrimitiveJavaObject(hiveFieldValue).bigDecimalValue(),
- holder.buffer, holder.start, holder.scale, holder.precision, Decimal38SparseHolder.nDecimalDigits);
- ((NullableDecimal38SparseVector) outputVV).getMutator().setSafe(outputIndex, holder);
+ ((NullableVarDecimalVector) outputVV).getMutator()
+ .setSafe(
+ outputIndex,
+ ((HiveDecimalObjectInspector) oi)
+ .getPrimitiveJavaObject(hiveFieldValue).bigDecimalValue()
+ .setScale(outputVV.getField().getScale(), RoundingMode.HALF_UP));
}
}