in xtable-core/src/main/java/org/apache/xtable/schema/SparkSchemaExtractor.java [57:121]
private DataType convertFieldType(InternalField field) {
switch (field.getSchema().getDataType()) {
case ENUM:
case STRING:
return DataTypes.StringType;
case INT:
return DataTypes.IntegerType;
case LONG:
return DataTypes.LongType;
case BYTES:
case FIXED:
case UUID:
return DataTypes.BinaryType;
case BOOLEAN:
return DataTypes.BooleanType;
case FLOAT:
return DataTypes.FloatType;
case DATE:
return DataTypes.DateType;
case TIMESTAMP:
return DataTypes.TimestampType;
case TIMESTAMP_NTZ:
return DataTypes.TimestampNTZType;
case DOUBLE:
return DataTypes.DoubleType;
case DECIMAL:
int precision =
(int) field.getSchema().getMetadata().get(InternalSchema.MetadataKey.DECIMAL_PRECISION);
int scale =
(int) field.getSchema().getMetadata().get(InternalSchema.MetadataKey.DECIMAL_SCALE);
return DataTypes.createDecimalType(precision, scale);
case RECORD:
return fromInternalSchema(field.getSchema());
case MAP:
InternalField key =
field.getSchema().getFields().stream()
.filter(
mapField ->
InternalField.Constants.MAP_KEY_FIELD_NAME.equals(mapField.getName()))
.findFirst()
.orElseThrow(() -> new SchemaExtractorException("Invalid map schema"));
InternalField value =
field.getSchema().getFields().stream()
.filter(
mapField ->
InternalField.Constants.MAP_VALUE_FIELD_NAME.equals(mapField.getName()))
.findFirst()
.orElseThrow(() -> new SchemaExtractorException("Invalid map schema"));
return DataTypes.createMapType(
convertFieldType(key), convertFieldType(value), value.getSchema().isNullable());
case LIST:
InternalField element =
field.getSchema().getFields().stream()
.filter(
arrayField ->
InternalField.Constants.ARRAY_ELEMENT_FIELD_NAME.equals(
arrayField.getName()))
.findFirst()
.orElseThrow(() -> new SchemaExtractorException("Invalid array schema"));
return DataTypes.createArrayType(
convertFieldType(element), element.getSchema().isNullable());
default:
throw new NotSupportedException("Unsupported type: " + field.getSchema().getDataType());
}
}