private DataWriter createWriter(ObjectInspector inspector, Type type) {
    if (type.isPrimitive()) {
      checkInspectorCategory(inspector, ObjectInspector.Category.PRIMITIVE);
      PrimitiveObjectInspector primitiveInspector = (PrimitiveObjectInspector)inspector;
      switch (primitiveInspector.getPrimitiveCategory()) {
        case BOOLEAN:
          return new BooleanDataWriter((BooleanObjectInspector)inspector);
        case BYTE:
          return new ByteDataWriter((ByteObjectInspector)inspector);
        case SHORT:
          return new ShortDataWriter((ShortObjectInspector)inspector);
        case INT:
          return new IntDataWriter((IntObjectInspector)inspector);
        case LONG:
          return new LongDataWriter((LongObjectInspector)inspector);
        case FLOAT:
          return new FloatDataWriter((FloatObjectInspector)inspector);
        case DOUBLE:
          return new DoubleDataWriter((DoubleObjectInspector)inspector);
        case STRING:
          return new StringDataWriter((StringObjectInspector)inspector);
        case CHAR:
          return new CharDataWriter((HiveCharObjectInspector)inspector);
        case VARCHAR:
          return new VarcharDataWriter((HiveVarcharObjectInspector)inspector);
        case BINARY:
          return new BinaryDataWriter((BinaryObjectInspector)inspector);
        case TIMESTAMP:
          return new TimestampDataWriter((TimestampObjectInspector)inspector);
        case DECIMAL:
          return new DecimalDataWriter((HiveDecimalObjectInspector)inspector);
        case DATE:
          return new DateDataWriter((DateObjectInspector)inspector);
        default:
          throw new IllegalArgumentException("Unsupported primitive data type: " + primitiveInspector.getPrimitiveCategory());
      }
    } else {
      GroupType groupType = type.asGroupType();
      LogicalTypeAnnotation logicalType = type.getLogicalTypeAnnotation();

      if (logicalType != null && logicalType instanceof ListLogicalTypeAnnotation) {
        checkInspectorCategory(inspector, ObjectInspector.Category.LIST);
        return new ListDataWriter((ListObjectInspector)inspector, groupType);
      } else if (logicalType != null && logicalType instanceof MapLogicalTypeAnnotation) {
        checkInspectorCategory(inspector, ObjectInspector.Category.MAP);
        return new MapDataWriter((MapObjectInspector)inspector, groupType);
      } else {
        checkInspectorCategory(inspector, ObjectInspector.Category.STRUCT);
        return new StructDataWriter((StructObjectInspector)inspector, groupType);
      }
    }
  }
Creates a writer for the specific object inspector. The returned writer will be used
to call Parquet API for the specific data type.
@param inspector The object inspector used to get the correct value type.
@param type Type that contains information about the type schema.
@return A ParquetWriter object used to call the Parquet API fo the specific data type.
ql/src/java/org/apache/hadoop/hive/ql/io/parquet/write/DataWritableWriter.java