我在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,我想。
你可以简单地编写一个函数来cast
一column
以doubleType
和使用功能的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)
我希望答案是有帮助
您可以指定新的数据帧的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()
希望这可以帮助!