private String convertComplexType(TypeDescription fieldType) {
    StringBuilder buffer = new StringBuilder();
    buffer.append(fieldType.getCategory().getName());
    switch (fieldType.getCategory()) {
    case LIST:
    case MAP:
    case UNION:
      buffer.append('<');
      for (int i = 0; i < fieldType.getChildren().size(); i++) {
        if (i != 0) {
          buffer.append(',');
        }
        buffer.append(convertOrcTypeToFieldType(fieldType.getChildren().get(i)));
      }
      buffer.append('>');
      break;
    case STRUCT:
      buffer.append('<');
      for (int i = 0; i < fieldType.getChildren().size(); ++i) {
        if (i != 0) {
          buffer.append(',');
        }
        getStructFieldName(buffer, fieldType.getFieldNames().get(i));
        buffer.append(':');
        buffer.append(convertOrcTypeToFieldType(fieldType.getChildren().get(i)));
      }
      buffer.append('>');
      break;
    default:
      throw new IllegalArgumentException("ORC doesn't handle " +
          fieldType.getCategory());
    }
    return buffer.toString();
  }
NOTE: if {@link serdeConstants#LIST_COLUMN_TYPES} is missing, all columns will be of String type.
ql/src/java/org/apache/hadoop/hive/ql/io/orc/OrcSerde.java