如何使用pyspark将字段从double转换为float并将其舍入

时间:2016-08-27 13:37:01

标签: pyspark

我有两个带有架构的数据框,如下所示: books_with_10_ratings_or_more_with_title:

root
 |-- ISBN: string (nullable = true)
 |-- count: long (nullable = false)
 |-- average: double (nullable = true)

和 books_df:

root
 |-- ISBN: string (nullable = true)
 |-- count: long (nullable = false)
 |-- average: double (nullable = true)

我试图将它们加在一起并将评级(即平均值)更改为浮动

books_with_10_ratings_or_more_with_title = books_with_10_ratings_or_more.join(books_df, 'ISBN').select('ISBN', 'Book-Title', 'Book-Author', 'Year', books_with_10_ratings_or_more.average.cast(float))

所以我可以使用以下代码对其进行舍入,它会抛出错误:

unexpected type:

代码有什么问题,我该如何解决?非常感谢你。

1 个答案:

答案 0 :(得分:4)

你可以做

books_with_10_ratings_or_more.average.cast('float')

from pyspark.sql.types import FloatType
books_with_10_ratings_or_more.average.cast(FloatType())

官方API文档中有an example

修改

所以你试图cast,因为round抱怨某些事情不是float。您不必投票,因为您使用三位数进行舍入并不会对FloatTypeDoubleType产生影响。

您的round因为您正在使用python中的函数而无法工作。您需要从pyspark.sql.functions导入它。例如,

from pyspark.sql.types import Row
from pyspark.sql.functions import col, round

df = sc.parallelize([
  Row(isbn=1, count=1, average=10.6666666),
  Row(isbn=2, count=1, average=11.1111111)
]).toDF()

df.select(round(col('average'), 3).alias('average')).collect()