невозможно сохранить десятичное значение в десятичном виде в фрейме данных pyspark - PullRequest
0 голосов
/ 14 января 2020

Я пытаюсь записать json в фрейм данных, используя pyspark. json имеет десятичное значение, и в схеме я также определил это поле как DecimalType, но при создании фрейма данных возникает исключение искры, что 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()

здесь я привел пример кода, но я не могу понять, каким образом искра определяет, что 20.0 является плавающим и не может храниться в десятичном виде?

1 Ответ

0 голосов
/ 14 января 2020

Одним из быстрых решений (не уверенным, что лучшее) является то, что вы можете прочитать файл 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)))
...