diff --git serde/src/java/org/apache/hadoop/hive/serde2/typeinfo/PrimitiveTypeInfo.java serde/src/java/org/apache/hadoop/hive/serde2/typeinfo/PrimitiveTypeInfo.java index 98524ad..2f46452 100644 --- serde/src/java/org/apache/hadoop/hive/serde2/typeinfo/PrimitiveTypeInfo.java +++ serde/src/java/org/apache/hadoop/hive/serde2/typeinfo/PrimitiveTypeInfo.java @@ -42,8 +42,12 @@ // Base name (varchar vs fully qualified name such as varchar(200)). protected String typeName; + private transient PrimitiveCategory primitiveCategory = null; + private transient Class primitiveWritableClass = null; + private transient Class primitiveJavaClass = null; + /** - * For java serialization use only. + * For Java/Kryo serialization use only. */ public PrimitiveTypeInfo() { } @@ -63,16 +67,39 @@ public Category getCategory() { return Category.PRIMITIVE; } + private void initTransients() { + if (typeName == null) { + return; + } + PrimitiveTypeEntry primitiveTypeEntry = + PrimitiveObjectInspectorUtils.getTypeEntryFromTypeName(typeName); + if (primitiveTypeEntry == null) { + return; + } + primitiveCategory = primitiveTypeEntry.primitiveCategory; + primitiveWritableClass = primitiveTypeEntry.primitiveWritableClass; + primitiveJavaClass = primitiveTypeEntry.primitiveJavaClass; + } + public PrimitiveCategory getPrimitiveCategory() { - return getPrimitiveTypeEntry().primitiveCategory; + if (primitiveCategory == null) { + initTransients(); + } + return primitiveCategory; } public Class getPrimitiveWritableClass() { - return getPrimitiveTypeEntry().primitiveWritableClass; + if (primitiveWritableClass == null) { + initTransients(); + } + return primitiveWritableClass; } public Class getPrimitiveJavaClass() { - return getPrimitiveTypeEntry().primitiveJavaClass; + if (primitiveJavaClass == null) { + initTransients(); + } + return primitiveJavaClass; } // The following 2 methods are for java serialization use only.