【问题标题】:Cast multiples columns in a DataFrame在 DataFrame 中转换多个列
【发布时间】:2017-09-26 16:14:41
【问题描述】:

我正在使用 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。

【问题讨论】:

    标签: scala apache-spark dataframe casting databricks


    【解决方案1】:

    你可以简单地写一个函数到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)
    

    希望回答对你有帮助

    【讨论】:

    • 我只是在最后一行的开头添加了 val DF2 = 以将演员表保存到 DF。我不知道为什么,但其他两个答案需要很多时间,我没有任何结果。我很确定它来自 Databricks。非常感谢。
    • 是的,您始终必须将转换分配给其他变量以进行保存。感谢您的支持和接受。 :)
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      让我建议使用 foldLeft:

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

      希望这会有所帮助!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-06-22
        • 2017-02-20
        • 2017-12-08
        • 2016-12-15
        • 1970-01-01
        • 2022-01-03
        • 2021-09-30
        • 2015-08-08
        相关资源
        最近更新 更多