Этот интересный пример, с которым я столкнулся, показывает два подхода и лучший подход и совпадает с другим ответом.Это Scala, а не pyspark, но применяется тот же принцип, хотя и в другом примере.
import org.apache.spark.sql.functions._
import spark.implicits._
val df = Seq(
("1","2", "3"),
("4", "5", "6"),
("100","101", "102")
).toDF("c1", "c2", "c3")
Это дорого, то есть withColumn, которое создает новый DF для каждой итерации:
val df2 = df.columns.foldLeft(df) { case (df, col) =>
df.withColumn(col, df(col).cast("int"))
}
//df2.show(false)
Это быстрее.
val df3 = df.select(df.columns.map { col =>
df(col).cast("int")
}: _*)
//df3.show(false)