in parquet-avro/src/main/java/org/apache/parquet/avro/AvroIndexedRecordConverter.java [140:181]
private static Converter newConverter(Schema schema, Type type, GenericData model, ParentValueContainer setter) {
LogicalType logicalType = schema.getLogicalType();
// the expected type is always null because it is determined by the parent
// datum class, which never helps for generic. when logical types are added
// to specific, this should pass the expected type here.
Conversion<?> conversion = model.getConversionFor(logicalType);
ParentValueContainer parent = ParentValueContainer.getConversionContainer(setter, conversion, schema);
switch (schema.getType()) {
case ARRAY:
return new AvroArrayConverter(parent, type.asGroupType(), schema, model);
case BOOLEAN:
return new AvroConverters.FieldBooleanConverter(parent);
case BYTES:
return new AvroConverters.FieldByteBufferConverter(parent);
case DOUBLE:
return new AvroConverters.FieldDoubleConverter(parent);
case ENUM:
return new FieldEnumConverter(parent, schema, model);
case FIXED:
return new FieldFixedConverter(parent, schema, model);
case FLOAT:
return new AvroConverters.FieldFloatConverter(parent);
case INT:
return new AvroConverters.FieldIntegerConverter(parent);
case LONG:
return new AvroConverters.FieldLongConverter(parent);
case MAP:
return new MapConverter(parent, type.asGroupType(), schema, model);
case RECORD:
return new AvroIndexedRecordConverter<>(parent, type.asGroupType(), schema, model);
case STRING:
return new AvroConverters.FieldStringConverter(parent);
case UNION:
return new AvroUnionConverter(parent, type, schema, model);
case NULL: // fall through
default:
throw new UnsupportedOperationException(
String.format("Cannot convert Avro type: %s" + " (Parquet type: %s) ", schema, type));
}
}