in parquet-arrow/src/main/java/org/apache/parquet/arrow/schema/SchemaConverter.java [731:909]
private TypeMapping map(final Field arrowField, final Type parquetField) {
return arrowField.getType().accept(new ArrowTypeVisitor<TypeMapping>() {
@Override
public TypeMapping visit(Null type) {
if (!parquetField.isRepetition(OPTIONAL)) {
throw new IllegalArgumentException("Parquet type can't be null: " + parquetField);
}
return primitive();
}
@Override
public TypeMapping visit(Struct type) {
if (parquetField.isPrimitive()) {
throw new IllegalArgumentException("Parquet type not a group: " + parquetField);
}
GroupType groupType = parquetField.asGroupType();
return new StructTypeMapping(
arrowField, groupType, map(arrowField.getChildren(), groupType.getFields()));
}
@Override
public TypeMapping visit(org.apache.arrow.vector.types.pojo.ArrowType.List type) {
return createListTypeMapping(type);
}
@Override
public TypeMapping visit(ArrowType.LargeList largeList) {
return createListTypeMapping(largeList);
}
@Override
public TypeMapping visit(org.apache.arrow.vector.types.pojo.ArrowType.FixedSizeList type) {
return createListTypeMapping(type);
}
@Override
public TypeMapping visit(ArrowType.ListView type) {
return createListTypeMapping(type);
}
private TypeMapping createListTypeMapping(ArrowType.ComplexType type) {
if (arrowField.getChildren().size() != 1) {
throw new IllegalArgumentException("Invalid list type: " + type);
}
Field arrowChild = arrowField.getChildren().get(0);
if (parquetField.isRepetition(REPEATED)) {
return new RepeatedTypeMapping(arrowField, parquetField, map(arrowChild, parquetField));
}
if (parquetField.isPrimitive()) {
throw new IllegalArgumentException("Parquet type not a group: " + parquetField);
}
List3Levels list3Levels = new List3Levels(parquetField.asGroupType());
if (arrowField.getChildren().size() != 1) {
throw new IllegalArgumentException("invalid arrow list: " + arrowField);
}
return new ListTypeMapping(arrowField, list3Levels, map(arrowChild, list3Levels.getElement()));
}
@Override
public TypeMapping visit(Union type) {
if (parquetField.isPrimitive()) {
throw new IllegalArgumentException("Parquet type not a group: " + parquetField);
}
GroupType groupType = parquetField.asGroupType();
return new UnionTypeMapping(
arrowField, groupType, map(arrowField.getChildren(), groupType.getFields()));
}
@Override
public TypeMapping visit(ArrowType.Map map) {
if (arrowField.getChildren().size() != 2) {
throw new IllegalArgumentException("Invalid map type: " + map);
}
if (parquetField.isPrimitive()) {
throw new IllegalArgumentException("Parquet type not a group: " + parquetField);
}
Map3Levels map3levels = new Map3Levels(parquetField.asGroupType());
if (arrowField.getChildren().size() != 2) {
throw new IllegalArgumentException("invalid arrow map: " + arrowField);
}
Field keyChild = arrowField.getChildren().get(0);
Field valueChild = arrowField.getChildren().get(1);
return new SchemaMapping.MapTypeMapping(
arrowField,
map3levels,
map(keyChild, map3levels.getKey()),
map(valueChild, map3levels.getValue()));
}
@Override
public TypeMapping visit(Int type) {
return primitive();
}
@Override
public TypeMapping visit(FloatingPoint type) {
return primitive();
}
@Override
public TypeMapping visit(Utf8 type) {
return primitive();
}
@Override
public TypeMapping visit(ArrowType.LargeUtf8 largeUtf8) {
return primitive();
}
@Override
public TypeMapping visit(ArrowType.Utf8View type) {
return primitive();
}
@Override
public TypeMapping visit(Binary type) {
return primitive();
}
@Override
public TypeMapping visit(ArrowType.LargeBinary largeBinary) {
return primitive();
}
@Override
public TypeMapping visit(ArrowType.BinaryView type) {
return primitive();
}
@Override
public TypeMapping visit(Bool type) {
return primitive();
}
@Override
public TypeMapping visit(Decimal type) {
return primitive();
}
@Override
public TypeMapping visit(Date type) {
return primitive();
}
@Override
public TypeMapping visit(Time type) {
return primitive();
}
@Override
public TypeMapping visit(Timestamp type) {
return primitive();
}
@Override
public TypeMapping visit(Interval type) {
return primitive();
}
@Override
public TypeMapping visit(ArrowType.Duration duration) {
return primitive();
}
@Override
public TypeMapping visit(ArrowType.FixedSizeBinary fixedSizeBinary) {
return primitive();
}
private TypeMapping primitive() {
if (!parquetField.isPrimitive()) {
throw new IllegalArgumentException("Can not map schemas as one is primitive and the other is not: "
+ arrowField + " != " + parquetField);
}
return new PrimitiveTypeMapping(arrowField, parquetField.asPrimitiveType());
}
});
}