private void fillColumnVector(PrimitiveObjectInspector.PrimitiveCategory category,
                                ListColumnVector lcv,
                                List valueList, int elementNum) {
    int total = valueList.size();
    setChildrenInfo(lcv, total, elementNum);
    switch (category) {
    case BOOLEAN:
      lcv.child = new LongColumnVector(total);
      for (int i = 0; i < valueList.size(); i++) {
        if (valueList.get(i) == null) {
          lcv.child.isNull[i] = true;
        } else {
          ((LongColumnVector) lcv.child).vector[i] = ((List<Integer>) valueList).get(i);
        }
      }
      break;
    case INT:
    case BYTE:
    case SHORT:
    case DATE:
    case INTERVAL_YEAR_MONTH:
    case LONG:
      lcv.child = new LongColumnVector(total);
      for (int i = 0; i < valueList.size(); i++) {
        if (valueList.get(i) == null) {
          lcv.child.isNull[i] = true;
        } else {
          ((LongColumnVector) lcv.child).vector[i] = ((List<Long>) valueList).get(i);
        }
      }
      break;
    case DOUBLE:
      lcv.child = new DoubleColumnVector(total);
      for (int i = 0; i < valueList.size(); i++) {
        if (valueList.get(i) == null) {
          lcv.child.isNull[i] = true;
        } else {
          ((DoubleColumnVector) lcv.child).vector[i] = ((List<Double>) valueList).get(i);
        }
      }
      break;
    case BINARY:
    case STRING:
    case CHAR:
    case VARCHAR:
      lcv.child = new BytesColumnVector(total);
      lcv.child.init();
      for (int i = 0; i < valueList.size(); i++) {
        byte[] src = ((List<byte[]>) valueList).get(i);
        if (src == null) {
          ((BytesColumnVector) lcv.child).setRef(i, src, 0, 0);
          lcv.child.isNull[i] = true;
        } else {
          ((BytesColumnVector) lcv.child).setRef(i, src, 0, src.length);
        }
      }
      break;
    case FLOAT:
      lcv.child = new DoubleColumnVector(total);
      for (int i = 0; i < valueList.size(); i++) {
        if (valueList.get(i) == null) {
          lcv.child.isNull[i] = true;
        } else {
          ((DoubleColumnVector) lcv.child).vector[i] = ((List<Float>) valueList).get(i);
        }
      }
      break;
    case DECIMAL:
      decimalTypeCheck(type);
      DecimalLogicalTypeAnnotation logicalType = (DecimalLogicalTypeAnnotation) type.getLogicalTypeAnnotation();
      int precision = logicalType.getPrecision();
      int scale = logicalType.getScale();
      lcv.child = new DecimalColumnVector(total, precision, scale);
      for (int i = 0; i < valueList.size(); i++) {
        if (valueList.get(i) == null) {
          lcv.child.isNull[i] = true;
        } else {
          ((DecimalColumnVector) lcv.child).vector[i].set(((List<byte[]>) valueList).get(i), scale);
        }
      }
      break;
    case INTERVAL_DAY_TIME:
    case TIMESTAMP:
    default:
      throw new RuntimeException("Unsupported type in the list: " + type);
    }
  }
The lengths & offsets will be initialized as default size (1024),
it should be set to the actual size according to the element number.
ql/src/java/org/apache/hadoop/hive/ql/io/parquet/vector/VectorizedListColumnReader.java