3

Я следую за this решением от одного из столбцов переполнения стека, мое единственное требование здесь - как я могу ограничить значения, которые я хочу суммировать, до 2-х цифр после десятичного знака до применения функции df.agg(sum())?Как ограничить десятичные значения до двух цифр перед применением функции agg?

Для примера: у меня есть значения, как показано ниже, и функция сумма подводит,

2.346 
1.549 

Однако я хочу значения должны быть округлены до 2 знака после запятой, как

2.35 
1.55 

Перед суммированием Это. Как мне это сделать? Я не смог найти какую-либо вспомогательную функцию, например sum().round функции sum. Примечание. Я использую версию искры 1.5.1.

ответ

4

Вы можете использовать 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| 
+--------+ 
+0

Привет @Psidom похоже, что bround доступен из версии искра 2.0, есть ли что-либо подобное в версии 1.5.1? – Explorer

+0

Кажется, что [round] (https://spark.apache.org/docs/2.0.2/api/java/org/apache/spark/sql/functions.html#round (org.apache.spark.sql. Column,% 20int)) является более универсальной версией и доступна с версии 1.5.0. Вы можете попробовать. Не знаю, почему есть две функции, выполняющие одно и то же. – Psidom

3

выше решение работает для версии искры 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