【问题标题】:how do I cast field from double to float and round it using pyspark如何使用 pyspark 将字段从 double 转换为 float 并舍入
【发布时间】:2016-08-27 13:37:00
【问题描述】:

我有两个数据框,其架构如下: 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:

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

【问题讨论】:

  • 请更新books_df 的架构。还请使用round 添加您的(尽可能完整,包括导入)代码。

标签: pyspark


【解决方案1】:

你可以这样做

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()

【讨论】:

  • 谢谢,我缺少的是演员表中的单引号。现在它是浮动的,我通过检查它的架构来验证它,但是,当我尝试用round('average',3) 对其进行四舍五入时,我收到一条错误消息:a float is required,你知道是什么原因吗?谢谢
猜你喜欢
  • 1970-01-01
  • 2017-03-04
  • 2019-04-23
  • 1970-01-01
  • 1970-01-01
  • 2015-07-23
  • 2012-05-04
  • 2020-04-10
  • 2013-01-08
相关资源
最近更新 更多