无法在pyspark数据框中以十进制类型保存十进制值

Posted

技术标签:

【中文标题】无法在pyspark数据框中以十进制类型保存十进制值【英文标题】:unable to save decimal value in decimal type in pyspark dataframe 【发布时间】:2020-01-14 11:41:04 【问题描述】:

我正在尝试使用 pyspark 将 json 写入数据帧。 json 有一个十进制值,在架构中我也将该字段定义为 DecimalType 但是在创建数据框时,spark 会抛出 TypeError: field pr: DecimalType(3,1) can not accept object 20.0 in type

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 是浮点数并且不能以十进制类型存储的?

【问题讨论】:

【参考方案1】:

其中一种快速解决方案(不确定是否最好)是您可以将 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)))

【讨论】:

以上是关于无法在pyspark数据框中以十进制类型保存十进制值的主要内容,如果未能解决你的问题,请参考以下文章

带有 hive 的 pyspark - 无法正确创建分区并从数据框中保存表

如何在 KDB 中以二进制格式保存列表/矩阵?

如何使用模式匹配从 pyspark 数据框中删除行?

C# - Emgu Cv - 人脸识别 - 将保存到 Access 数据库的人脸训练集作为二进制文件加载到 EigenObjectRecognizer 中以进行人脸识别

在文本框中显示数据库中的十进制值

如何从 pyspark 数据框中更快地保存 csv 文件?