in odps/tableschema/arrow_util.go [116:191]
func TypeToArrowType(odpsType datatype.DataType) (arrow.DataType, error) {
switch odpsType.ID() {
case datatype.BOOLEAN:
return arrow.FixedWidthTypes.Boolean, nil
case datatype.TINYINT:
return arrow.PrimitiveTypes.Int8, nil
case datatype.SMALLINT:
return arrow.PrimitiveTypes.Int16, nil
case datatype.INT:
return arrow.PrimitiveTypes.Int32, nil
case datatype.BIGINT:
return arrow.PrimitiveTypes.Int64, nil
case datatype.FLOAT:
return arrow.PrimitiveTypes.Float32, nil
case datatype.DOUBLE:
return arrow.PrimitiveTypes.Float64, nil
case datatype.CHAR, datatype.VARCHAR, datatype.STRING, datatype.JSON:
return arrow.BinaryTypes.String, nil
case datatype.BINARY:
return arrow.BinaryTypes.Binary, nil
case datatype.DATE:
return arrow.FixedWidthTypes.Date32, nil
case datatype.DATETIME:
return arrow.FixedWidthTypes.Timestamp_ms, nil
case datatype.TIMESTAMP:
return arrow.FixedWidthTypes.Timestamp_ns, nil
case datatype.TIMESTAMP_NTZ:
return arrow.FixedWidthTypes.Timestamp_ns, nil
case datatype.IntervalDayTime:
return arrow.FixedWidthTypes.DayTimeInterval, nil
case datatype.IntervalYearMonth:
return arrow.FixedWidthTypes.MonthInterval, nil
case datatype.DECIMAL:
decimal, _ := odpsType.(datatype.DecimalType)
return &arrow.Decimal128Type{
Precision: decimal.Precision,
Scale: decimal.Scale,
}, nil
case datatype.STRUCT:
structType, _ := odpsType.(datatype.StructType)
arrowFields := make([]arrow.Field, len(structType.Fields))
for i, field := range structType.Fields {
arrowType, err := TypeToArrowType(field.Type)
if err != nil {
return arrow.Null, err
}
arrowFields[i] = arrow.Field{
Name: field.Name,
Type: arrowType,
}
}
return arrow.StructOf(arrowFields...), nil
case datatype.ARRAY:
arrayType, _ := odpsType.(datatype.ArrayType)
itemType, err := TypeToArrowType(arrayType.ElementType)
if err != nil {
return arrow.Null, err
}
return arrow.ListOf(itemType), nil
// case datatype.MAP:
// mapType, _ := odpsType.(datatype.MapType)
// keyType, err := TypeToArrowType(mapType.KeyType)
// if err != nil {
// return arrow.Null, err
// }
// valueType, err := TypeToArrowType(mapType.ValueType)
// if err != nil {
// return arrow.Null, err
// }
// return arrow.MapOf(keyType, valueType), nil
}
return arrow.Null, errors.Errorf("unknown odps data type: %s", odpsType.Name())
}