我正在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
,也会得到理想的结果。
那我该如何解决这个错误的计算呢?