Проблема в том, что df.columns
вернет список строк, содержащий имена столбцов. dataType, с другой стороны, является членом класса StructField . Чтобы получить DataType, вы должны использовать df.schema.fields
. Это выведет список полей в Array[StructField]
:
import org.apache.spark.sql.types.{StructField, DecimalType, DoubleType}
import org.apache.spark.sql.functions.col
val df = Seq(
(130, Decimal(122.45), "t1"),
(536, Decimal(1.45), "t2"),
(518, Decimal(0.45), "t3"))
.toDF("ID","decimal","tmp")
df.printSchema
// root
// |-- ID: integer (nullable = false)
// |-- decimal: decimal(38,18) (nullable = true)
// |-- tmp: string (nullable = true)
val decimalSchema = df.schema.fields.map{f =>
f match{
case StructField(name:String, _:DecimalType, _, _) => col(name).cast(DoubleType)
case _ => col(f.name)
}
}
df.select(decimalSchema:_*).printSchema
// root
// |-- ID: integer (nullable = false)
// |-- decimal: double (nullable = true)
// |-- tmp: string (nullable = true)
Карта вернет список столбцов, в которых DecimalType заменен DoubleType.