我有两个带有架构的数据框,如下所示: 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))
所以我可以使用以下代码对其进行舍入,它会抛出错误:
代码有什么问题,我该如何解决?非常感谢你。
答案 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
。您不必投票,因为您使用三位数进行舍入并不会对FloatType
或DoubleType
产生影响。
您的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()