in parquet-arrow/src/main/java/org/apache/parquet/arrow/schema/SchemaConverter.java [585:704]
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(org.apache.arrow.vector.types.pojo.ArrowType.FixedSizeList 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(Int type) {
return primitive();
}
@Override
public TypeMapping visit(FloatingPoint type) {
return primitive();
}
@Override
public TypeMapping visit(Utf8 type) {
return primitive();
}
@Override
public TypeMapping visit(Binary 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.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());
}
});
}