private TypeInfo getFieldTypeIgnoreCase(TypeInfo hiveTypeInfo, String fieldName, int fieldIndex) {
    if (hiveTypeInfo == null) {
      return null;
    } else if (hiveTypeInfo.getCategory().equals(ObjectInspector.Category.STRUCT)) {
      return getStructFieldTypeInfo(fieldName, fieldIndex);
    } else if (hiveTypeInfo.getCategory().equals(ObjectInspector.Category.MAP)) {
      //This cover the case where hive table may have map<key, value> but the data file is
      // of type array<struct<value1, value2>>
      //Using index in place of type name.
      if (fieldIndex == 0) {
        return ((MapTypeInfo) hiveTypeInfo).getMapKeyTypeInfo();
      } else if (fieldIndex == 1) {
        return ((MapTypeInfo) hiveTypeInfo).getMapValueTypeInfo();
      } else {//Other fields are skipped for this case
        return null;
      }
    }
    throw new RuntimeException("Unknown hive type info " + hiveTypeInfo + " when searching for field " + fieldName);
  }
A MapWritableGroupConverter, real converter between hive and parquet types recursively for complex types.
ql/src/java/org/apache/hadoop/hive/ql/io/parquet/convert/HiveStructConverter.java