在DataFrame中转换多列

时间:2017-09-26 06:47:53

标签: scala apache-spark dataframe casting databricks

关于Databricks,我正在处理分类问题。 我有一个拥有2000多列的DataFrame。我想将所有将成为要素的列强制转换为double。

val array45 = data.columns drop(1)

for (element <- array45) {

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

}
 data.printSchema()

要加倍的强制转换正在运行,但我没有将其保存在名为Data的DataFrame中。如果我在循环中创建一个新的DataFrame;在for循环之外我的DataFrame不存在。 我不想使用UDF。

我该如何解决这个问题?

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

3 个答案:

答案 0 :(得分:3)

您可以简单地将函数写入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)

我希望答案很有帮助

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

我建议使用foldLeft:

    val array45 = data.columns drop(1)

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

    newData.printSchema()

希望这有帮助!