在 DataFrame 中投射多列

Cast multiples columns in a DataFrame

我在使用 Databricks,我正在处理分类问题。 我有一个包含 2000 多列的 DataFrame。我想将所有将成为特征的列投射到两倍。

val array45 = data.columns drop(1)

for (element <- array45) {

data.withColumn(element, data(element).cast("double"))

}
 data.printSchema()

转换为 double 有效,但我没有将其保存在名为 Data 的 DataFrame 中。如果我在循环中创建一个新的 DataFrame ;在 for 循环之外,我的 DataFrame 将不存在。 我不想使用 UDF。

我该如何解决这个问题?

编辑: 谢谢你们的回答!我不知道为什么,但 Shaido 和 Raul 的答案需要花费大量时间来计算。我认为它来自 Databricks。

您可以在每次迭代时将新数据帧分配给 var,从而始终保持最新数据帧。

var finalData = data.cache()
for (element <- array45) {
  finalData = finalData.withColumn(element, finalData(element).cast("double"))
}

让我建议使用 foldLeft:

    val array45 = data.columns drop(1)

    val newData = array45.foldLeft(data)(
          (acc,c) =>
            acc.withColumn(c, data(c).cast("double")))

    newData.printSchema()

希望对您有所帮助!

你可以简单地编写一个函数到 cast 一个 columndoubleType 并在 select 方法中使用该函数。

函数:

import org.apache.spark.sql.types._
def func(column: Column) = column.cast(DoubleType)

然后使用select中的函数作为

val array45 = data.columns.drop(1)
import org.apache.spark.sql.functions._
data.select(array45.map(name => func(col(name))): _*).show(false)

希望回答对你有帮助