func TypeToArrowType()

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())
}