无法在pyspark dataframe中以十进制类型保存十进制值

无法在pyspark dataframe中以十进制类型保存十进制值,pyspark,rdd,Pyspark,Rdd,我正在尝试使用pyspark将json写入数据帧。json有一个十进制值,在模式中我也将该字段定义为DecimalType,但在创建数据帧时,spark抛出异常TypeError:field pr:DecimalType(3,1)不能接受类型中的对象20.0 r={'name':'wellreading','pr':20.0} distData=sc.parallelize([r]) schema=StructType([StructField('name',StringType(),True)

我正在尝试使用pyspark将json写入数据帧。json有一个十进制值,在模式中我也将该字段定义为DecimalType,但在创建数据帧时,spark抛出异常TypeError:field pr:DecimalType(3,1)不能接受类型中的对象20.0

r={'name':'wellreading','pr':20.0}
distData=sc.parallelize([r])
schema=StructType([StructField('name',StringType(),True),StructField('pr',DecimalType(3,1),True)])
df=spark.createDataFrame(distData,schema)
df.collect()


这里我给出了一个示例代码,但我无法理解spark为什么确定20.0是浮点型,而不能以十进制类型存储

快速解决方案之一(不确定是否是最好的)是,您可以将json文件直接读取到数据帧,然后执行您喜欢的转换,例如

from pyspark.sql.types import DecimalType
from pyspark.sql.functions import col

df1 = spark.read.json("/tmp/test.json")

df2 = df1.select(col('name'),col('pr').cast(DecimalType(3,1)).alias('pr'))
df2.printSchema()

root
 |-- name: string (nullable = true)
 |-- pr: decimal(3,1) (nullable = true)

df2 = df1.withColumn("pr",df1.pr.cast(DecimalType(3,1)))