Apache spark spark sql中如何保持分数值的固定精度

Apache spark spark sql中如何保持分数值的固定精度,apache-spark,sql-server-2012,apache-spark-sql,pyspark-sql,Apache Spark,Sql Server 2012,Apache Spark Sql,Pyspark Sql,我陷入了一个非常奇怪的货币计算问题。我需要在点后保留数字,但不知何故spark显示地板或天花板值 举例来说 My expected output is 871.25 spark output is 871.00 我从中间表中获取双类型值,为此我将双值转换为十进制值,精度为固定的2位数字。我的测试代码是 spark.sql("select cast(SUM(TRANAMT) as DECIMAL(20,2)) as Expr1 from CMSDLG").show() 我不知道

我陷入了一个非常奇怪的货币计算问题。我需要在点后保留数字,但不知何故spark显示地板或天花板值 举例来说

My expected output is 871.25 
spark output is       871.00
我从中间表中获取双类型值,为此我将双值转换为十进制值,精度为固定的2位数字。我的测试代码是

spark.sql("select cast(SUM(TRANAMT) as DECIMAL(20,2)) as Expr1 from  CMSDLG").show()

我不知道我需要关注哪一部分。请帮帮我。我正在使用pyspark 2.0

您应该在施放后求和

spark.sql("select SUM(cast(TRANAMT as DECIMAL(20,2)) ) as Expr1 from  CMSDLG").show()

改为使用此查询,将
varchar
转换为
decimal
,然后
round
sum
转换为
2
小数位

spark.sql("select round(sum(cast(TRANAMT as decimal(65,30))),2) as Expr1 from CMSDLG").show()

您可以使用
round()
函数代替强制转换。谢谢您的回复,但它不起作用。它保持不变首先,输入表(SQL Server)的模式是什么,
DataFrame
的模式是什么,以及如何导入数据?@zero323您的建议给了我一些想法。我想这是图式。导入的数据是远程SQLserver中的字符串。但是我把它转换成了十进制,所以点后的数字被削减了。谢谢你的回复,但它不起作用。它给了我同样的结果,可以对sql进行检查查询吗?事实上,我是在你的宝贵建议之后这样做的。你确定你的表中有十进制值吗?好的,弗雷德里克,我已经检查过了。您是对的,我的cmsdlg表格值是字符串,但我将其转换为整数十进制,然后将其向上取整,但代码没有任何更改。您可能对spark.sql(“选择round(SUM(DecimalConvert(TRANAMT)),2)作为cmsdlg的Expr1”)感兴趣。show()