Я выполняю простую агрегацию сумм в 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
и не думаю, чтоэто связано с этим, но с тем, как я выполняю операции с окном и агг.
Также, если я сделаю .persist()
до groupBy
, я получу желаемый результат.
Так, как я могу решить этот неправильный расчет?