创建数据框时创建十进制类型的列

问题描述 投票:0回答:2

我想在创建 Spark 数据框时提供数字。我在提供小数类型数字时遇到问题。

这样数字就会被截断:

df = spark.createDataFrame([(10234567891023456789.5, )], ["numb"])
df = df.withColumn("numb_dec", F.col("numb").cast("decimal(30,1)"))
df.show(truncate=False)
#+---------------------+----------------------+
#|numb                 |numb_dec              |
#+---------------------+----------------------+
#|1.0234567891023456E19|10234567891023456000.0|
#+---------------------+----------------------+

这失败了:

df = spark.createDataFrame([(10234567891023456789.5, )], "numb decimal(30,1)")
df.show(truncate=False)

TypeError:字段numb:DecimalType(30,1)无法接受类型中的对象1.0234567891023456e + 19

如何正确提供大十进制数字以免被截断?

apache-spark pyspark types apache-spark-sql decimal
2个回答
1
投票

这可能与Python和Spark之间浮点表示的一些差异有关。您可以尝试在创建数据框时传递字符串值:

df = spark.createDataFrame([("10234567891023456789.5", )], ["numb"])

df = df.withColumn("numb_dec", F.col("numb").cast("decimal(30,1)"))
df.show(truncate=False)
#+----------------------+----------------------+
#|numb                  |numb_dec              |
#+----------------------+----------------------+
#|10234567891023456789.5|10234567891023456789.5|
#+----------------------+----------------------+

1
投票

尝试以下操作 -

from pyspark.sql.types import *
from decimal import *

schema = StructType([StructField('numb', DecimalType(30,1))])

data = [( Context(prec=30, Emax=999, clamp=1).create_decimal('10234567891023456789.5'), )]

df = spark.createDataFrame(data=data, schema=schema)

df.show(truncate=False)

+----------------------+
|numb                  |
+----------------------+
|10234567891023456789.5|
+----------------------+
© www.soinside.com 2019 - 2024. All rights reserved.