code: public static ColumnIO getArrayElementColumn(ColumnIO columnIO)
      {
          while (columnIO instanceof GroupColumnIO && !columnIO.getType().isRepetition(REPEATED)) {
              columnIO = ((GroupColumnIO) columnIO).getChild(0);
          }
  
          /* If array has a standard 3-level structure with middle level repeated group with a single field:
           *  optional group my_list (LIST) {
           *     repeated group element {
           *        required binary str (UTF8);
           *     };
           *  }
           */
          if (columnIO instanceof GroupColumnIO &&
                  columnIO.getType().getOriginalType() == null &&
                  ((GroupColumnIO) columnIO).getChildrenCount() == 1 &&
                  !columnIO.getName().equals("array") &&
                  !columnIO.getName().equals(columnIO.getParent().getName() + "_tuple")) {
              return ((GroupColumnIO) columnIO).getChild(0);
          }
  
          /* Backward-compatibility support for 2-level arrays where a repeated field is not a group:
           *   optional group my_list (LIST) {
           *      repeated int32 element;
           *   }
           */
          return columnIO;
      }
docs: /* For backward-compatibility, the type of elements in LIST-annotated structures should always be determined by the following rules:
  1. If the repeated field is not a group, then its type is the element type and elements are required.
  2. If the repeated field is a group with multiple fields, then its type is the element type and elements are required.
  3. If the repeated field is a group with one field and is named either array or uses the LIST-annotated group's name with _tuple appended then the repeated type is the element type and elements are required.
  4. Otherwise, the repeated field's type is the element type with the repeated field's repetition.
  https://github.com/apache/parquet-format/blob/master/LogicalTypes.md#lists