关于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,我想。
答案 0 :(得分:3)
您可以简单地将函数写入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)
我希望答案很有帮助
答案 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()
希望这有帮助!