in adapter/avro/src/main/java/org/apache/arrow/adapter/avro/ArrowToAvroUtils.java [399:533]
private static BaseAvroProducer<?> createProducer(FieldVector vector, boolean nullable) {
Preconditions.checkNotNull(vector, "Arrow vector object can't be null");
final Types.MinorType minorType = vector.getMinorType();
// Avro understands nullable types as a union of type | null
// Most nullable fields in a VSR will not be unions, so provide a special wrapper
if (nullable && minorType != Types.MinorType.UNION) {
final BaseAvroProducer<?> innerProducer = createProducer(vector, false);
return new AvroNullableProducer<>(innerProducer);
}
switch (minorType) {
case NULL:
return new AvroNullProducer((NullVector) vector);
case BIT:
return new AvroBooleanProducer((BitVector) vector);
case TINYINT:
return new AvroTinyIntProducer((TinyIntVector) vector);
case SMALLINT:
return new AvroSmallIntProducer((SmallIntVector) vector);
case INT:
return new AvroIntProducer((IntVector) vector);
case BIGINT:
return new AvroBigIntProducer((BigIntVector) vector);
case UINT1:
return new AvroUint1Producer((UInt1Vector) vector);
case UINT2:
return new AvroUint2Producer((UInt2Vector) vector);
case UINT4:
return new AvroUint4Producer((UInt4Vector) vector);
case UINT8:
return new AvroUint8Producer((UInt8Vector) vector);
case FLOAT2:
return new AvroFloat2Producer((Float2Vector) vector);
case FLOAT4:
return new AvroFloat4Producer((Float4Vector) vector);
case FLOAT8:
return new AvroFloat8Producer((Float8Vector) vector);
case VARBINARY:
return new AvroBytesProducer((VarBinaryVector) vector);
case FIXEDSIZEBINARY:
return new AvroFixedSizeBinaryProducer((FixedSizeBinaryVector) vector);
case VARCHAR:
return new AvroStringProducer((VarCharVector) vector);
// Logical types
case DECIMAL:
return new AvroDecimalProducer((DecimalVector) vector);
case DECIMAL256:
return new AvroDecimal256Producer((Decimal256Vector) vector);
case DATEDAY:
return new AvroDateDayProducer((DateDayVector) vector);
case DATEMILLI:
return new AvroDateMilliProducer((DateMilliVector) vector);
case TIMESEC:
return new AvroTimeSecProducer((TimeSecVector) vector);
case TIMEMILLI:
return new AvroTimeMilliProducer((TimeMilliVector) vector);
case TIMEMICRO:
return new AvroTimeMicroProducer((TimeMicroVector) vector);
case TIMENANO:
return new AvroTimeNanoProducer((TimeNanoVector) vector);
case TIMESTAMPSEC:
return new AvroTimestampSecProducer((TimeStampSecVector) vector);
case TIMESTAMPMILLI:
return new AvroTimestampMilliProducer((TimeStampMilliVector) vector);
case TIMESTAMPMICRO:
return new AvroTimestampMicroProducer((TimeStampMicroVector) vector);
case TIMESTAMPNANO:
return new AvroTimestampNanoProducer((TimeStampNanoVector) vector);
case TIMESTAMPSECTZ:
return new AvroTimestampSecTzProducer((TimeStampSecTZVector) vector);
case TIMESTAMPMILLITZ:
return new AvroTimestampMilliTzProducer((TimeStampMilliTZVector) vector);
case TIMESTAMPMICROTZ:
return new AvroTimestampMicroTzProducer((TimeStampMicroTZVector) vector);
case TIMESTAMPNANOTZ:
return new AvroTimestampNanoTzProducer((TimeStampNanoTZVector) vector);
// Complex types
case STRUCT:
StructVector structVector = (StructVector) vector;
List<FieldVector> childVectors = structVector.getChildrenFromFields();
Producer<?>[] childProducers = new Producer<?>[childVectors.size()];
for (int i = 0; i < childVectors.size(); i++) {
FieldVector childVector = childVectors.get(i);
childProducers[i] = createProducer(childVector, childVector.getField().isNullable());
}
return new AvroStructProducer(structVector, childProducers);
case LIST:
ListVector listVector = (ListVector) vector;
FieldVector itemVector = listVector.getDataVector();
Producer<?> itemProducer = createProducer(itemVector, itemVector.getField().isNullable());
return new AvroListProducer(listVector, itemProducer);
case FIXED_SIZE_LIST:
FixedSizeListVector fixedListVector = (FixedSizeListVector) vector;
FieldVector fixedItemVector = fixedListVector.getDataVector();
Producer<?> fixedItemProducer =
createProducer(fixedItemVector, fixedItemVector.getField().isNullable());
return new AvroFixedSizeListProducer(fixedListVector, fixedItemProducer);
case MAP:
MapVector mapVector = (MapVector) vector;
StructVector entryVector = (StructVector) mapVector.getDataVector();
Types.MinorType keyType = entryVector.getChildrenFromFields().get(0).getMinorType();
if (keyType != Types.MinorType.VARCHAR) {
throw new IllegalArgumentException("MAP key type must be VARCHAR for Avro encoding");
}
VarCharVector keyVector = (VarCharVector) entryVector.getChildrenFromFields().get(0);
FieldVector valueVector = entryVector.getChildrenFromFields().get(1);
Producer<?> keyProducer = new AvroStringProducer(keyVector);
Producer<?> valueProducer =
createProducer(valueVector, valueVector.getField().isNullable());
Producer<?> entryProducer =
new AvroStructProducer(entryVector, new Producer<?>[] {keyProducer, valueProducer});
return new AvroMapProducer(mapVector, entryProducer);
// Support for UNION and DENSEUNION is not currently available
// This is pending fixes in the implementation of the union vectors themselves
// https://github.com/apache/arrow-java/issues/108
default:
// Not all Arrow types are supported for encoding (yet)!
String error =
String.format(
"Encoding Arrow type %s to Avro is not currently supported", minorType.name());
throw new UnsupportedOperationException(error);
}
}