【问题标题】:How can I optimize spark function to round a double value to 2 decimals?如何优化 spark 函数以将双精度值舍入到小数点后 2 位?
【发布时间】:2019-05-23 21:52:52
【问题描述】:

下面是我的 Spark 函数,它是直截了当的

def doubleToRound(df:DataFrame,roundColsList:Array[String]): DataFrame ={
    var y:DataFrame = df
    for(colDF <- y.columns){
      if(roundColsList.contains(colDF)){
        y = y.withColumn(colDF,functions.round(y.col(colDF),2))
      }
    }

这是按预期工作的,通过使给定 DF 的多个列的值将十进制值四舍五入到 2 个位置。但是我正在遍历 DataFrame y,直到列 Array[Sting].length()。 有什么更好的方法吗?

谢谢大家

【问题讨论】:

    标签: scala apache-spark hadoop apache-spark-sql


    【解决方案1】:

    您可以简单地使用selectmap,如下例所示:

    import org.apache.spark.sql.functions._
    import spark.implicits._
    
    val df = Seq(
      ("a", 1.22, 2.333, 3.4444),
      ("b", 4.55, 5.666, 6.7777)
    ).toDF("id", "v1", "v2", "v3")
    
    val roundCols = df.columns.filter(_.startsWith("v"))  // Or filter with other conditions
    val otherCols = df.columns diff roundCols
    
    df.select(otherCols.map(col) ++ roundCols.map(c => round(col(c), 2).as(c)): _*).show
    // +---+----+----+----+
    // | id|  v1|  v2|  v3|
    // +---+----+----+----+
    // |  a|1.22|2.33|3.44|
    // |  b|4.55|5.67|6.78|
    // +---+----+----+----+
    

    让它成为一种方法:

    import org.apache.spark.sql.DataFrame
    
    def doubleToRound(df: DataFrame, roundCols: Array[String]): DataFrame = {
      val otherCols = df.columns diff roundCols
      df.select(otherCols.map(col) ++ roundCols.map(c => round(col(c), 2).as(c)): _*)
    }
    

    或者,使用foldLeftwithColumn,如下所示:

    def doubleToRound(df: DataFrame, roundCols: Array[String]): DataFrame =
      roundCols.foldLeft(df)((acc, c) => acc.withColumn(c, round(col(c), 2)))
    

    【讨论】:

    • 哇,Leo,我已经使用我的解决方案完成了我的工作,它比以前花费了相当多的时间。我将使用此逻辑并运行该作业。但这看起来更加优化。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-13
    相关资源
    最近更新 更多