【发布时间】:2020-06-28 17:53:52
【问题描述】:
条件是:以Data-C开头的列名是StringType列,Data-D是DateType列,Data-N是DoubleType列。我有一个数据框,其中所有列的数据类型都是一个字符串,所以我试图以这样的方式更新它们的数据类型:
import org.apache.spark.sql.functions._
import sparkSession.sqlContext.implicits._
val diff_set = Seq("col7", "col8", "col15", "Data-C-col1", "Data-C-col3", "Data-N-col2", "Data-N-col4", "Data-D-col16", "Data-D-col18", "Data-D-col20").toSet
var df = (1 to 10).toDF
df = df.select(df.columns.map(c => col(c).as(c)) ++ diff_set.map(c => lit(null).cast("string").as(c)): _*)
df.printSchema()
// This foreach loop yields slow performance
df.columns.foreach(x => {
if (x.startsWith("Data-C")) {
df = df.withColumn(x, col(x).cast(StringType))
} else if (x.startsWith("Data-D")) {
df = df.withColumn(x, col(x).cast(DateType))
} else if (x.startsWith("Data-N")) {
df = df.withColumn(x, col(x).cast(DoubleType))
}
}
)
df.printSchema()
这可以在 scala-spark 中更优雅、更高效地完成(性能方面)吗?
【问题讨论】:
-
下面的解决方案有效吗??
标签: dataframe apache-spark apache-spark-sql