在 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
一个 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)
希望回答对你有帮助
我在使用 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
一个 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)
希望回答对你有帮助