@marmbrus Good question. I'm not yet totally sure myself. But consider the following example: You have an array of structs, which have another array as field. So something like:

`ArrayType(StructType(Seq(ArrayType(IntegerType))))`

Lets call the inner array `inner` and the outer array `outer`. Note that `outer` could be itself just a field in a higher-level record.

Now whenever Parquet is done passing the data for the current `inner` it will let you know by calling `end` on the converter for that field, in this case an array converter. Now the current struct has been processed completely, so its converter's `end` will be called, too. The current `outer` record, however, may or not may be completed. If it's not completed, then the current `inner` needs to be stored somewhere and you cannot use a mutable row because it is not yet save to reuse that chunk of memory whenever the next `inner` comes along.

Does this make any sense at all? I'm happy to discuss other solutions, too.