@Override
  public boolean isNextComplexMultiValue() {
    Preconditions.checkState(currentLevel > 0);

    final ComplexTypeHelper complexTypeHelper = currentComplexTypeHelpers[currentLevel - 1];
    final Field complexField = complexTypeHelper.complexField;
    final int fieldPosition = complexTypeHelper.fieldPosition;
    final int complexFieldEnd = complexTypeHelper.complexFieldEnd;
    switch (complexField.complexCategory) {
    case LIST:
      {
        // Allow for empty string, etc.
        final ListComplexTypeHelper listHelper = (ListComplexTypeHelper) complexTypeHelper;
        final boolean isElementStringFamily;
        final Field elementField = listHelper.elementField;
        if (elementField.isPrimitive) {
          switch (elementField.primitiveCategory) {
            case STRING:
            case VARCHAR:
            case CHAR:
              isElementStringFamily = true;
              break;
            default:
              isElementStringFamily = false;
              break;
          }
        } else {
          isElementStringFamily = false;
        }
        final boolean isNext;
        if (isElementStringFamily) {
          isNext = (fieldPosition <= complexFieldEnd);
        } else {
          isNext = (fieldPosition < complexFieldEnd);
        }
        if (!isNext) {
          popComplexType();
        }
        return isNext;
      }
    case MAP:
      {
        final boolean isNext = (fieldPosition < complexFieldEnd);
        if (!isNext) {
          popComplexType();
        }
        return isNext;
      }
    case STRUCT:
    case UNION:
      throw new Error("Complex category " + complexField.complexCategory + " not multi-value");
    default:
      throw new Error("Unexpected complex category " + complexField.complexCategory);
    }
  }
Parse the byte[] and fill each field.

This is an adapted version of the parse method in the LazyStruct class.
They should parse things the same way.
serde/src/java/org/apache/hadoop/hive/serde2/lazy/fast/LazySimpleDeserializeRead.java