in parquet-avro/src/main/java/org/apache/parquet/avro/AvroRecordConverter.java [339:418]
private static Converter newConverter(
Schema schema,
Type type,
GenericData model,
Class<?> knownClass,
ParentValueContainer setter,
ReflectClassValidator validator) {
LogicalType logicalType = schema.getLogicalType();
Conversion<?> conversion;
if (knownClass != null) {
conversion = model.getConversionByClass(knownClass, logicalType);
} else {
conversion = model.getConversionFor(logicalType);
}
ParentValueContainer parent = ParentValueContainer.getConversionContainer(setter, conversion, schema);
switch (schema.getType()) {
case BOOLEAN:
return new AvroConverters.FieldBooleanConverter(parent);
case INT:
Class<?> intDatumClass = getDatumClass(conversion, knownClass, schema, model);
if (intDatumClass == null) {
return new AvroConverters.FieldIntegerConverter(parent);
}
if (intDatumClass == byte.class || intDatumClass == Byte.class) {
return new AvroConverters.FieldByteConverter(parent);
}
if (intDatumClass == char.class || intDatumClass == Character.class) {
return new AvroConverters.FieldCharConverter(parent);
}
if (intDatumClass == short.class || intDatumClass == Short.class) {
return new AvroConverters.FieldShortConverter(parent);
}
return new AvroConverters.FieldIntegerConverter(parent);
case LONG:
return new AvroConverters.FieldLongConverter(parent);
case FLOAT:
return new AvroConverters.FieldFloatConverter(parent);
case DOUBLE:
return new AvroConverters.FieldDoubleConverter(parent);
case BYTES:
Class<?> byteDatumClass = getDatumClass(conversion, knownClass, schema, model);
if (byteDatumClass == null) {
return new AvroConverters.FieldByteBufferConverter(parent);
}
if (byteDatumClass.isArray() && byteDatumClass.getComponentType() == byte.class) {
return new AvroConverters.FieldByteArrayConverter(parent);
}
return new AvroConverters.FieldByteBufferConverter(parent);
case STRING:
if (logicalType != null
&& logicalType.getName().equals(LogicalTypes.uuid().getName())) {
return new AvroConverters.FieldUUIDConverter(parent, type.asPrimitiveType());
}
return newStringConverter(schema, model, parent, validator);
case RECORD:
return new AvroRecordConverter(parent, type.asGroupType(), schema, model, validator);
case ENUM:
return new AvroConverters.FieldEnumConverter(parent, schema, model);
case ARRAY:
Class<?> arrayDatumClass = getDatumClass(conversion, knownClass, schema, model);
if (arrayDatumClass != null && arrayDatumClass.isArray()) {
return new AvroArrayConverter(
parent, type.asGroupType(), schema, model, arrayDatumClass, validator);
}
return new AvroCollectionConverter(
parent, type.asGroupType(), schema, model, arrayDatumClass, validator);
case MAP:
return new MapConverter(parent, type.asGroupType(), schema, model, validator);
case UNION:
return new AvroUnionConverter(parent, type, schema, model, validator);
case FIXED:
return new AvroConverters.FieldFixedConverter(parent, schema, model);
default:
throw new UnsupportedOperationException(
String.format("Cannot convert Avro type: %s to Parquet type: %s", schema, type));
}
}