static Row selectRow( Row input, FieldAccessDescriptor fieldAccessDescriptor, Schema inputSchema, Schema outputSchema) { if (fieldAccessDescriptor.allFields()) { return input; } else { Row.Builder output = Row.withSchema(outputSchema); for (int fieldId : fieldAccessDescriptor.fieldIdsAccessed()) { output.addValue(input.getValue(fieldId)); } for (Map.Entry<Integer, FieldAccessDescriptor> nested : fieldAccessDescriptor.nestedFields().entrySet()) { String fieldName = inputSchema.nameOf(nested.getKey()); Schema nestedInputSchema = inputSchema.getField(nested.getKey()).getType().getRowSchema(); Schema nestedOutputSchema = outputSchema.getField(fieldName).getType().getRowSchema(); output.addValue( selectRow( input.getValue(fieldName), nested.getValue(), nestedInputSchema, nestedOutputSchema)); } return output.build(); } } }