pyspark 创建嵌套框架时创建小数类型的列

atmip9wb  于 2024-01-06  发布在  Spark
关注(0)|答案(2)|浏览(229)

我想在创建Spark框架时提供数字。我在提供十进制类型的数字时遇到问题。
这样,数字就被截断了:

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

字符串
这失败了:

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


TypeError:field number:DecimalType(30,1)cannot accept object 1.0234567891023456e+19 in type <class 'float'>
如何正确地提供大的十进制数,使他们不会被截断?

6vl6ewon

6vl6ewon1#

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

  1. df = spark.createDataFrame([("10234567891023456789.5", )], ["numb"])
  2. df = df.withColumn("numb_dec", F.col("numb").cast("decimal(30,1)"))
  3. df.show(truncate=False)
  4. #+----------------------+----------------------+
  5. #|numb |numb_dec |
  6. #+----------------------+----------------------+
  7. #|10234567891023456789.5|10234567891023456789.5|
  8. #+----------------------+----------------------+

字符串

kb5ga3dv

kb5ga3dv2#

试试下面的东西-

  1. from pyspark.sql.types import *
  2. from decimal import *
  3. schema = StructType([StructField('numb', DecimalType(30,1))])
  4. data = [( Context(prec=30, Emax=999, clamp=1).create_decimal('10234567891023456789.5'), )]
  5. df = spark.createDataFrame(data=data, schema=schema)
  6. df.show(truncate=False)
  7. +----------------------+
  8. |numb |
  9. +----------------------+
  10. |10234567891023456789.5|
  11. +----------------------+

字符串

展开查看全部

相关问题