in xtable-hive-metastore/src/main/java/org/apache/xtable/hms/HMSSchemaExtractor.java [62:142]
private String convertToTypeString(InternalSchema fieldSchema) {
switch (fieldSchema.getDataType()) {
case BOOLEAN:
return "boolean";
case INT:
return "int";
case LONG:
return "bigint";
case FLOAT:
return "float";
case DOUBLE:
return "double";
case DATE:
return "date";
case ENUM:
case STRING:
return "string";
case TIMESTAMP:
case TIMESTAMP_NTZ:
return "timestamp";
case FIXED:
case BYTES:
return "binary";
case DECIMAL:
Map<InternalSchema.MetadataKey, Object> metadata = fieldSchema.getMetadata();
if (metadata == null || metadata.isEmpty()) {
throw new NotSupportedException("Invalid decimal type, precision and scale is missing");
}
int precision =
(int)
metadata.computeIfAbsent(
InternalSchema.MetadataKey.DECIMAL_PRECISION,
k -> {
throw new NotSupportedException("Invalid decimal type, precision is missing");
});
int scale =
(int)
metadata.computeIfAbsent(
InternalSchema.MetadataKey.DECIMAL_SCALE,
k -> {
throw new NotSupportedException("Invalid decimal type, scale is missing");
});
return String.format("decimal(%s,%s)", precision, scale);
case RECORD:
final String nameToType =
fieldSchema.getFields().stream()
.map(f -> String.format("%s:%s", f.getName(), convertToTypeString(f.getSchema())))
.collect(Collectors.joining(","));
return String.format("struct<%s>", nameToType);
case LIST:
InternalField arrayElement =
fieldSchema.getFields().stream()
.filter(
arrayField ->
InternalField.Constants.ARRAY_ELEMENT_FIELD_NAME.equals(
arrayField.getName()))
.findFirst()
.orElseThrow(() -> new SchemaExtractorException("Invalid array schema"));
return String.format("array<%s>", convertToTypeString(arrayElement.getSchema()));
case MAP:
InternalField key =
fieldSchema.getFields().stream()
.filter(
mapField ->
InternalField.Constants.MAP_KEY_FIELD_NAME.equals(mapField.getName()))
.findFirst()
.orElseThrow(() -> new SchemaExtractorException("Invalid map schema"));
InternalField value =
fieldSchema.getFields().stream()
.filter(
mapField ->
InternalField.Constants.MAP_VALUE_FIELD_NAME.equals(mapField.getName()))
.findFirst()
.orElseThrow(() -> new SchemaExtractorException("Invalid map schema"));
return String.format(
"map<%s,%s>",
convertToTypeString(key.getSchema()), convertToTypeString(value.getSchema()));
default:
throw new NotSupportedException("Unsupported type: " + fieldSchema.getDataType());
}
}