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 0b31d9a9a2..fa5ab6ffdc 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,44 +107,7 @@ // Map from PrimitiveTypeInfo to AbstractPrimitiveWritableObjectInspector. private static ConcurrentHashMap - cachedPrimitiveWritableInspectorCache = - 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); - } + primitiveWritableInspectorCache = new ConcurrentHashMap<>(); private static Map primitiveCategoryToWritableOI = @@ -271,14 +239,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,34 +274,26 @@ 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) { + final AbstractPrimitiveWritableObjectInspector result = + primitiveWritableInspectorCache.computeIfAbsent(typeInfo, (key) -> { + switch (key.getPrimitiveCategory()) { + case CHAR: + return new WritableHiveCharObjectInspector((CharTypeInfo) typeInfo); + case VARCHAR: + return new WritableHiveVarcharObjectInspector( + (VarcharTypeInfo) typeInfo); + case TIMESTAMPLOCALTZ: + return new WritableTimestampLocalTZObjectInspector( + (TimestampLocalTZTypeInfo) typeInfo); + case DECIMAL: + return new WritableHiveDecimalObjectInspector( + (DecimalTypeInfo) typeInfo); + default: + return getPrimitiveWritableObjectInspector( + key.getPrimitiveCategory()); + } + }); return result; }