Java 关于双值的Spark-SQL求和函数问题
我们正在尝试使用sparksqlsum函数对双值求和 样本数据: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
+------+
|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
如果您想对数字进行四舍五入,请使用。