private boolean isSubType(
    final GroupType groupType,
    final Type subtype) {
    if (subtype.isPrimitive() || subtype.isRepetition(Type.Repetition.REPEATED)) {
      return groupType.getFields().contains(subtype);
    } else {
      for (Type g : groupType.getFields()) {
        if (!g.isPrimitive() && g.getName().equals(subtype.getName())) {
          // check all elements are contained in g
          boolean containsAll = false;
          for (Type subSubType : subtype.asGroupType().getFields()) {
            containsAll = isSubType(g.asGroupType(), subSubType);
            if (!containsAll) {
              break;
            }
          }
          if (containsAll) {
            return containsAll;
          }
        }
      }
      return false;
    }
  }
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