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