我如何使用 pyspark 将字段从 double 投射到浮动和圆形

7 pyspark

我有两个数据框,其架构如下:books_with_10_ratings_or_more_with_title:

root
 |-- ISBN: string (nullable = true)
 |-- count: long (nullable = false)
 |-- average: double (nullable = true)
Run Code Online (Sandbox Code Playgroud)

和books_df:

root
 |-- ISBN: string (nullable = true)
 |-- count: long (nullable = false)
 |-- average: double (nullable = true)
Run Code Online (Sandbox Code Playgroud)

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

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))
Run Code Online (Sandbox Code Playgroud)

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

意外类型:

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

Shu*_*uan 6

你可以这样做

books_with_10_ratings_or_more.average.cast('float')
Run Code Online (Sandbox Code Playgroud)

或者

from pyspark.sql.types import FloatType
books_with_10_ratings_or_more.average.cast(FloatType())
Run Code Online (Sandbox Code Playgroud)

官方API文档中有一个例子

编辑

所以你试图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()
Run Code Online (Sandbox Code Playgroud)