【问题标题】:How to limit decimal values to 2 digits before applying agg function?如何在应用 agg 函数之前将十进制值限制为 2 位?
【发布时间】:2019-01-10 03:44:34
【问题描述】:

我正在关注来自堆栈溢出帖子之一的this 解决方案,我在这里唯一的要求是如何在应用df.agg(sum()) 函数之前将我想要求和的值限制为小数点后2 位?

例如:我有如下的值,并且 sum 函数将其相加,

2.346
1.549

但是我希望将值四舍五入到小数点后 2 位,如

2.35
1.55

在求和之前。我该怎么做?我找不到像函数sumsum().round 这样的子函数。

注意:我使用的是 Spark 1.5.1 版本。

【问题讨论】:

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


    【解决方案1】:

    你可以使用bround:

    val df = Seq(2.346, 1.549).toDF("A")
    df.select(bround(df("A"), 2)).show
    +------------+
    |bround(A, 2)|
    +------------+
    |        2.35|
    |        1.55|
    +------------+
    
    
    df.agg(sum(bround(df("A"), 2)).as("appSum")).show
    +------------------+
    |            appSum|
    +------------------+
    |3.9000000000000004|
    +------------------+
                                              ^
    df.agg(sum(df("A")).as("exactSum")).show
    +--------+
    |exactSum|
    +--------+
    |   3.895|
    +--------+
    

    【讨论】:

    • 嗨 @Psidom 看起来 bround 可以从 spark 2.0 版本中获得,在 1.5.1 版本中有类似的东西吗?
    • 看来round 是更通用的版本,从 1.5.0 开始可用。你可以试一试。不知道为什么有两个函数做同样的事情。
    • @Psidom:实际上它们并不相同。 bround 使用 HALF_EVEN 舍入模式,而 round 使用 HALF_UP 舍入模式
    【解决方案2】:

    上述解决方案确实适用于 spark 2.0 版本,但是对于像我这样仍在使用 1.5.*+ 版本的人来说是可行的。(我使用了 @Psidom 建议的圆形函数):

    val df = Seq(2.346, 1.549).toDF("A")
    df.select(bround(df("A"), 2)).show
    +------------+
    |bround(A, 2)|
    +------------+
    |        2.35|
    |        1.55|
    +------------+
    
    val total=df.agg(sum(round(df.col(colName),2)).cast("double")).first.getDouble(0)
    total: Double = 3.90
    

    【讨论】:

      猜你喜欢
      • 2017-03-29
      • 2021-08-26
      • 1970-01-01
      • 2018-03-10
      • 2017-03-08
      • 1970-01-01
      • 2019-01-23
      • 2014-02-20
      • 2022-01-13
      相关资源
      最近更新 更多