Java 关于双值的Spark-SQL求和函数问题

Java 关于双值的Spark-SQL求和函数问题,java,apache-spark-sql,aggregate-functions,Java,Apache Spark Sql,Aggregate Functions,我们正在尝试使用sparksqlsum函数对双值求和 样本数据: +------+ |amount| +------+ | 1000| | 1050| | 2049| +------+ df.select("amount").show(); df.registerTempTable("table"); sqlContext.sql("select amount/pow(10,2) from table").show(); sqlContext.sql("select sum((amoun

我们正在尝试使用sparksqlsum函数对双值求和

样本数据:

+------+
|amount|
+------+
|  1000|
|  1050|
|  2049|
+------+
df.select("amount").show();
df.registerTempTable("table");
sqlContext.sql("select amount/pow(10,2) from table").show();
sqlContext.sql("select sum((amount/pow(10,2))) from table").show();
+-----+
|  _c0|
+-----+
| 10.0|
| 10.5|
|20.49|
+-----+
+------------------+
|               _c0|
+------------------+
|40.989999999999995|
+------------------+
示例代码:

+------+
|amount|
+------+
|  1000|
|  1050|
|  2049|
+------+
df.select("amount").show();
df.registerTempTable("table");
sqlContext.sql("select amount/pow(10,2) from table").show();
sqlContext.sql("select sum((amount/pow(10,2))) from table").show();
+-----+
|  _c0|
+-----+
| 10.0|
| 10.5|
|20.49|
+-----+
+------------------+
|               _c0|
+------------------+
|40.989999999999995|
+------------------+
精度之后:

+------+
|amount|
+------+
|  1000|
|  1050|
|  2049|
+------+
df.select("amount").show();
df.registerTempTable("table");
sqlContext.sql("select amount/pow(10,2) from table").show();
sqlContext.sql("select sum((amount/pow(10,2))) from table").show();
+-----+
|  _c0|
+-----+
| 10.0|
| 10.5|
|20.49|
+-----+
+------------------+
|               _c0|
+------------------+
|40.989999999999995|
+------------------+
求和后的输出:

+------+
|amount|
+------+
|  1000|
|  1050|
|  2049|
+------+
df.select("amount").show();
df.registerTempTable("table");
sqlContext.sql("select amount/pow(10,2) from table").show();
sqlContext.sql("select sum((amount/pow(10,2))) from table").show();
+-----+
|  _c0|
+-----+
| 10.0|
| 10.5|
|20.49|
+-----+
+------------------+
|               _c0|
+------------------+
|40.989999999999995|
+------------------+
执行的输出是
40.99
,但为什么它的输出是
40.98999999995


感谢您的帮助。

请确保总和的计算结果为(Spark SQL映射)

例如:
从表中选择sum(cast(金额为十进制)/cast(pow(10,2)为十进制)


我建议您将金额转换为十进制。

我不知道spark,但这似乎是另一个问题的例子。@Thomas:谢谢您提供的信息。。有什么解决办法吗?嗯,正如我说的,我不知道Spark,但在Java中,我要么对值进行四舍五入(可能先加0.001或其他ε),要么使用
BigDecimal
甚至仅整数数学。我不确定spark支持什么,但您可以尝试重写您的查询,尽可能长时间地使用整数数学,即从表中选择总和(金额)/pow(10,2),甚至从表中选择总和(金额)/100@Thomas:看来这一个正在工作
从表
中选择总和(金额)/pow(10,2),非常感谢。。让我测试更多的场景。谢谢,它可以工作,但是它的打印
40.9900000000
如果您想对数字进行四舍五入,请使用。