如何将float对象转换为doubletype?

fv2wmkja  于 2021-07-14  发布在  Spark
关注(0)|答案(1)|浏览(274)

我要求求一列的总数,但它要求答案是十进制的,四舍五入到两位数。我很容易得到总数。我花了一点时间将其取整,但现在我有了它,值作为float对象返回。我想不出怎么把这个转换成小数。我尝试过将float转换成一个新的Dataframe,尝试过将float转换成doubletype,尝试过将其转换为sum公式的一部分,甚至尝试过多种方法对列求和。我搞不懂!
Dataframe有一个名为“tolls\u amount”的列。我尝试了两种求和的方法,两种方法似乎都不返回十进制类型(尽管都返回正确的答案):

df2 = df.withColumn("tolls_amount", df["tolls_amount"].cast(DoubleType())) 
sum_number = df2[["tolls_amount"]].groupBy().sum().collect()[0][0]
df2 = df.withColumn("tolls_amount", df["tolls_amount"].cast(DoubleType())) 
sum_number = df2.agg({"tolls_amount":"sum"}).collect()[0]
just_num = sum_number["sum(tolls_amount)"].round(2)

以下是我试图将其作为小数点的一些内容:

sum_number = df2[["tolls_amount"]].groupBy().sum().collect()[0][0]
sum_df = sum_number.withColumn("Total", sum_number.cast(DoubleType()))
sum_2 = sum_number.cast(DoubleType())
sum_number = df2[["tolls_amount"]].groupBy().sum().cast(DoubleType()).collect()[0][0]

我有一些其他的,但一直删除他们,因为他们不工作。有没有办法做到这一点?该列的总数为2430066.7000020845,四舍五入为2430066.7 round(sum_number, 2) ,但两者都有一种浮点类型,而不是十进制类型。

bf1o4zei

bf1o4zei1#

您可以在聚合期间将数字四舍五入到小数点后2位,并在收集到python之前转换为十进制类型:

import pyspark.sql.functions as F

sum_number = df[["tolls_amount"]].groupBy().agg(
    F.round(
        F.sum('tolls_amount'), 2
    ).cast('decimal(20,2)')
).collect()[0][0]

相关问题