使用窗口函数后,为什么会得到错误的聚合结果?

时间:2019-04-26 08:34:54

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

我正在Spark上对一个数据框执行简单的求和聚合,其中较早应用了窗口函数来过滤每个组的前N行。我做错了吗?

final val ROW_NUMBER = "rn"

val w = Window.partitionBy("country","city").orderBy(col("value1").desc)

//Take <limit> top rows per partition
dataFrame
      .withColumn(ROW_NUMBER, row_number.over(w)).where(s"${ROW_NUMBER} <= ${limit}").drop(ROW_NUMBER)
      .groupBy("country","city")
      .agg(sum("value2")) as SUM

因此,在groupBy之前,某个“国家/地区”组有5行,在“ value2”列中具有以下值:

2365.043427972000
995.547820893999
654.523335518999
605.818748763294
506.335132493999

总和应为5127.26846564229,但我得到的是5122.31192618555,这破坏了进一步的计算。

我正在使用的数据类型是Double,但是我也尝试过使用Decimal,但我认为它与此无关,但与我处理window和agg操作的方式有关。

如果我在.persist()之前做groupBy,也会得到理想的结果。

那我该如何解决这个错误的计算呢?

0 个答案:

没有答案