抛在一个数据帧的倍数列(Cast multiples columns in a DataFrame)

2019-10-29 12:59发布

我在Databricks和我工作的分类问题。 我有2000多个列的数据帧。 我想投都将成为功能翻一番列。

val array45 = data.columns drop(1)

for (element <- array45) {

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

}
 data.printSchema()

翻番演员是工作,但我不会将其保存在名为Data数据帧。 如果我创建的循环一个新的数据帧; 外面的for循环我的数据帧将不存在。 我不想使用UDF。

我该如何解决这个问题?

编辑:感谢你们俩的回答! 我不知道为什么,但Shaido和劳尔的回答都采取了大量的时间来计算。 它来自Databricks,我想。

Answer 1:

你可以简单地编写一个函数来castcolumndoubleType和使用功能的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)

我希望答案是有帮助



Answer 2:

您可以指定新的数据帧的var在每次迭代,从而保持在所有时间最近的一个。

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


Answer 3:

让我建议使用foldLeft:

    val array45 = data.columns drop(1)

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

    newData.printSchema()

希望这可以帮助!



文章来源: Cast multiples columns in a DataFrame