我有一个大约1000列的Spark DataFrame DF1所有字符串类型列。现在,我想根据列名的条件将DF1的列类型从字符串转换为其他类型,例如Double,INT等。例如假设DF1只有三列字符串类型
df1.printSchema
col1_term1: String
col2_term2: String
col3_term3: String
更改列类型的条件是如果Col名称包含术语1,则将其更改为int,如果col名称包含术语2,则将其更改为duble等。我是Spark的新手。
您可以简单地映射列,然后根据列名将列施加到适当的数据类型:
import org.apache.spark.sql.types._
val df = Seq(("1", "2", "3"), ("2", "3", "4")).toDF("col1_term1", "col2_term2", "col3_term3")
val cols = df.columns.map(x => {
if (x.contains("term1")) col(x).cast(IntegerType)
else if (x.contains("term2")) col(x).cast(DoubleType)
else col(x)
})
df.select(cols: _*).printSchema
root
|-- col1_term1: integer (nullable = true)
|-- col2_term2: double (nullable = true)
|-- col3_term3: string (nullable = true)
虽然与 @psidom 提出的解决方案不会产生任何不同的结果,但您也可以使用一些Scala
'S 句法 - 糖喜欢这个
val modifiedDf: DataFrame = originalDf.columns.foldLeft[DataFrame](originalDf) { (tmpDf: DataFrame, colName: String) =>
if (colName.contains("term1")) tmpDf.withColumn(colName, tmpDf(colName).cast(IntegerType))
else if (colName.contains("term2")) tmpDf.withColumn(colName, tmpDf(colName).cast(DoubleType))
else tmpDf
}