如何优化 spark 函数以将双精度值舍入到小数点后 2 位?

Posted

技术标签:

【中文标题】如何优化 spark 函数以将双精度值舍入到小数点后 2 位?【英文标题】:How can I optimize spark function to round a double value to 2 decimals? 【发布时间】: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()。 有什么更好的方法吗?

谢谢大家

【问题讨论】:

【参考方案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,我已经使用我的解决方案完成了我的工作,它比以前花费了相当多的时间。我将使用此逻辑并运行该作业。但这看起来更加优化。

以上是关于如何优化 spark 函数以将双精度值舍入到小数点后 2 位?的主要内容,如果未能解决你的问题,请参考以下文章

将双精度数舍入到 x 有效数字

将双精度值舍入为 2 位十进制数字 [重复]

在java中将双精度值舍入为两位有效数字[重复]

即使在 C 中使用“\n%.2f”后,也无法将浮点值舍入到最接近的第二个小数 [关闭]

将双精度舍入到最接近的非次正规表示

如何在小数点后将 Dart 中的双精度数舍入到给定的精度?