diff --git a/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/primitive/PrimitiveObjectInspectorFactory.java b/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/primitive/PrimitiveObjectInspectorFactory.java index 0b31d9a..665cdf2 100644 --- a/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/primitive/PrimitiveObjectInspectorFactory.java +++ b/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/primitive/PrimitiveObjectInspectorFactory.java @@ -51,6 +51,8 @@ import org.apache.hadoop.io.LongWritable; import org.apache.hadoop.io.Text; import org.apache.hadoop.io.Writable; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; /** * PrimitiveObjectInspectorFactory is the primary way to create new @@ -63,6 +65,9 @@ */ public final class PrimitiveObjectInspectorFactory { + private static final Logger LOG = + LoggerFactory.getLogger(PrimitiveObjectInspectorFactory.class); + public static final WritableBooleanObjectInspector writableBooleanObjectInspector = new WritableBooleanObjectInspector(); public static final WritableByteObjectInspector writableByteObjectInspector = @@ -102,45 +107,9 @@ // Map from PrimitiveTypeInfo to AbstractPrimitiveWritableObjectInspector. private static ConcurrentHashMap - cachedPrimitiveWritableInspectorCache = + primitiveWritableInspectorCache = new ConcurrentHashMap<>(); - static { - cachedPrimitiveWritableInspectorCache.put(TypeInfoFactory.getPrimitiveTypeInfo(serdeConstants.BOOLEAN_TYPE_NAME), - writableBooleanObjectInspector); - cachedPrimitiveWritableInspectorCache.put(TypeInfoFactory.getPrimitiveTypeInfo(serdeConstants.TINYINT_TYPE_NAME), - writableByteObjectInspector); - cachedPrimitiveWritableInspectorCache.put(TypeInfoFactory.getPrimitiveTypeInfo(serdeConstants.SMALLINT_TYPE_NAME), - writableShortObjectInspector); - cachedPrimitiveWritableInspectorCache.put(TypeInfoFactory.getPrimitiveTypeInfo(serdeConstants.INT_TYPE_NAME), - writableIntObjectInspector); - cachedPrimitiveWritableInspectorCache.put(TypeInfoFactory.getPrimitiveTypeInfo(serdeConstants.BIGINT_TYPE_NAME), - writableLongObjectInspector); - cachedPrimitiveWritableInspectorCache.put(TypeInfoFactory.getPrimitiveTypeInfo(serdeConstants.FLOAT_TYPE_NAME), - writableFloatObjectInspector); - cachedPrimitiveWritableInspectorCache.put(TypeInfoFactory.getPrimitiveTypeInfo(serdeConstants.DOUBLE_TYPE_NAME), - writableDoubleObjectInspector); - cachedPrimitiveWritableInspectorCache.put(TypeInfoFactory.getPrimitiveTypeInfo(serdeConstants.STRING_TYPE_NAME), - writableStringObjectInspector); - cachedPrimitiveWritableInspectorCache.put(TypeInfoFactory.charTypeInfo, writableHiveCharObjectInspector); - cachedPrimitiveWritableInspectorCache.put(TypeInfoFactory.varcharTypeInfo, writableHiveVarcharObjectInspector); - cachedPrimitiveWritableInspectorCache.put(TypeInfoFactory.getPrimitiveTypeInfo(serdeConstants.VOID_TYPE_NAME), - writableVoidObjectInspector); - cachedPrimitiveWritableInspectorCache.put(TypeInfoFactory.getPrimitiveTypeInfo(serdeConstants.DATE_TYPE_NAME), - writableDateObjectInspector); - cachedPrimitiveWritableInspectorCache.put(TypeInfoFactory.getPrimitiveTypeInfo(serdeConstants.TIMESTAMP_TYPE_NAME), - writableTimestampObjectInspector); - cachedPrimitiveWritableInspectorCache.put(TypeInfoFactory.timestampLocalTZTypeInfo, - writableTimestampTZObjectInspector); - cachedPrimitiveWritableInspectorCache.put(TypeInfoFactory.getPrimitiveTypeInfo(serdeConstants.INTERVAL_YEAR_MONTH_TYPE_NAME), - writableHiveIntervalYearMonthObjectInspector); - cachedPrimitiveWritableInspectorCache.put(TypeInfoFactory.getPrimitiveTypeInfo(serdeConstants.INTERVAL_DAY_TIME_TYPE_NAME), - writableHiveIntervalDayTimeObjectInspector); - cachedPrimitiveWritableInspectorCache.put(TypeInfoFactory.getPrimitiveTypeInfo(serdeConstants.BINARY_TYPE_NAME), - writableBinaryObjectInspector); - cachedPrimitiveWritableInspectorCache.put(TypeInfoFactory.decimalTypeInfo, writableHiveDecimalObjectInspector); - } - private static Map primitiveCategoryToWritableOI = new EnumMap<>(PrimitiveCategory.class); @@ -271,14 +240,32 @@ * @param primitiveCategory primitive category input to be looked up. */ public static AbstractPrimitiveWritableObjectInspector getPrimitiveWritableObjectInspector( - PrimitiveCategory primitiveCategory) { - AbstractPrimitiveWritableObjectInspector result = primitiveCategoryToWritableOI.get(primitiveCategory); + final PrimitiveCategory primitiveCategory) { + + final AbstractPrimitiveWritableObjectInspector result = + primitiveCategoryToWritableOI.get(primitiveCategory); if (result == null) { throw new RuntimeException("Internal error: Cannot find ObjectInspector " + " for " + primitiveCategory); } + if (LOG.isDebugEnabled()) { + LOG.debug("Loading PrimitiveWritableObjectInspector for type: {}", + result); + switch (primitiveCategory) { + case CHAR: + case VARCHAR: + case TIMESTAMPLOCALTZ: + case DECIMAL: + LOG.debug("Loading a generic PrimitiveWritableObjectInspector for a " + + "type that that is usually parameterized. All parameter " + + "information will be lost! Ex: CHAR(5) will become CHAR(255)"); + default: + break; + } + } + return result; } @@ -288,33 +275,32 @@ public static AbstractPrimitiveWritableObjectInspector getPrimitiveWritableObjec * @return AbstractPrimitiveWritableObjectInspector instance */ public static AbstractPrimitiveWritableObjectInspector getPrimitiveWritableObjectInspector( - PrimitiveTypeInfo typeInfo) { - AbstractPrimitiveWritableObjectInspector result = cachedPrimitiveWritableInspectorCache.get(typeInfo); - if (result != null) { - return result; - } - - switch (typeInfo.getPrimitiveCategory()) { - case CHAR: - result = new WritableHiveCharObjectInspector((CharTypeInfo) typeInfo); - break; - case VARCHAR: - result = new WritableHiveVarcharObjectInspector((VarcharTypeInfo) typeInfo); - break; - case TIMESTAMPLOCALTZ: - result = new WritableTimestampLocalTZObjectInspector((TimestampLocalTZTypeInfo) typeInfo); - break; - case DECIMAL: - result = new WritableHiveDecimalObjectInspector((DecimalTypeInfo) typeInfo); - break; - default: - throw new RuntimeException("Failed to create object inspector for " + typeInfo); - } - - AbstractPrimitiveWritableObjectInspector prev = - cachedPrimitiveWritableInspectorCache.putIfAbsent(typeInfo, result); - if (prev != null) { - result = prev; + final PrimitiveTypeInfo typeInfo) { + AbstractPrimitiveWritableObjectInspector result = + primitiveWritableInspectorCache.get(typeInfo); + if (result == null) { + switch (typeInfo.getPrimitiveCategory()) { + case CHAR: + result = new WritableHiveCharObjectInspector((CharTypeInfo) typeInfo); + break; + case VARCHAR: + result = + new WritableHiveVarcharObjectInspector((VarcharTypeInfo) typeInfo); + break; + case TIMESTAMPLOCALTZ: + result = new WritableTimestampLocalTZObjectInspector( + (TimestampLocalTZTypeInfo) typeInfo); + break; + case DECIMAL: + result = + new WritableHiveDecimalObjectInspector((DecimalTypeInfo) typeInfo); + break; + default: + // Early return, do not cache + return getPrimitiveWritableObjectInspector( + typeInfo.getPrimitiveCategory()); + } + primitiveWritableInspectorCache.put(typeInfo, result); } return result; }