无法在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 - 无法正确创建分区并从数据框中保存表
C# - Emgu Cv - 人脸识别 - 将保存到 Access 数据库的人脸训练集作为二进制文件加载到 EigenObjectRecognizer 中以进行人脸识别