我想在創建 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: field numb: DecimalType(30,1) can't accept object 1.0234567891023456e 19 in type <class 'float'>
如何正確提供大十進制數字,以免它們被截斷?
uj5u.com熱心網友回復:
這可能與 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|
# ---------------------- ----------------------
uj5u.com熱心網友回復:
嘗試如下 -
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|
----------------------
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/450578.html
標籤:阿帕奇火花 pyspark 类型 apache-spark-sql 十进制
下一篇:無法訪問上傳到Databricks社區版Runtime9.1上的dbfs的檔案。嘗試了同樣無效的dbutils.fs.cp解決方法
