小编Ric*_*fey的帖子

为什么BigDecimal的Spark groupBy.agg(min/max)总是返回0?

我正在尝试按DataFrame的一列进行分组,并在每个结果组中生成BigDecimal列的minmax值.结果总是产生非常小的(大约0)值.

(min/max针对Double列的类似调用会产生预期的非零值.)

举个简单的例子:

如果我创建以下DataFrame:

import org.apache.spark.sql.{functions => f}

case class Foo(group: String, bd_value: BigDecimal, d_value: Double)

val rdd = spark.sparkContext.parallelize(Seq(
  Foo("A", BigDecimal("1.0"), 1.0),
  Foo("B", BigDecimal("10.0"), 10.0),
  Foo("B", BigDecimal("1.0"), 1.0),
  Foo("C", BigDecimal("10.0"), 10.0),
  Foo("C", BigDecimal("10.0"), 10.0),
  Foo("C", BigDecimal("10.0"), 10.0)
))

val df = rdd.toDF()
Run Code Online (Sandbox Code Playgroud)

选择maxDouble或BigDecimal列将返回预期结果:

df.select(f.max("d_value")).show()

// +------------+
// |max(d_value)|
// +------------+
// |        10.0|
// +------------+

df.select(f.max("bd_value")).show()

// +--------------------+
// |       max(bd_value)|
// +--------------------+
// |10.00000000000000...|
// +--------------------+
Run Code Online (Sandbox Code Playgroud)

但是如果我分组然后聚合,我得到Double列的合理结果,但BigDecimal列的值接近于零:

df.groupBy("group").agg(f.max("d_value")).show()

// +-----+------------+ …
Run Code Online (Sandbox Code Playgroud)

bigdecimal apache-spark apache-spark-sql

5
推荐指数
1
解决办法
488
查看次数