如何在pyspark中关闭科学记数法?

Posted

技术标签:

【中文标题】如何在pyspark中关闭科学记数法?【英文标题】:How to turn off scientific notation in pyspark? 【发布时间】:2016-10-23 18:47:55 【问题描述】:

作为一些聚合的结果,我想出了以下 sparkdataframe:

 ------------+-----------------+-----------------+
|sale_user_id|gross_profit     |total_sale_volume|
+------------+-----------------+-----------------+
|       20569|       -3322960.0|     2.12569482E8|
|       24269|       -1876253.0|      8.6424626E7|
|        9583|              0.0|       1.282272E7|
|       11722|          18229.0|        5653149.0|
|       37982|           6077.0|        1181243.0|
|       20428|           1665.0|        7011588.0|
|       41157|          73227.0|        1.18631E7|
|        9993|              0.0|        1481437.0|
|        9030|           8865.0|      4.4133791E7|
|         829|              0.0|          11355.0|
+------------+-----------------+-----------------+

数据框的架构是:

root
 |-- sale_user_id: string (nullable = true)
 |-- tapp_gross_profit: double (nullable = true)
 |-- total_sale_volume: double (nullable = true)

如何在 Gross_profit 和 total_sale_volume 列中禁用科学记数法?

【问题讨论】:

【参考方案1】:

最简单的方法是将双列转换为十进制,给出适当的precision and scale:

df.withColumn('total_sale_volume', df.total_sale_volume.cast(DecimalType(18, 2)))

【讨论】:

知道如何在不通知小数位数(指数)的情况下做到这一点吗?我的意思是,让它被推断? @BrunoAmbrozio 你总是可以.collect() 一个数据框,然后你有一个纯 python 对象,可以更好地控制这些对象的打印方式 (***.com/questions/658763/…) 现在我需要的几乎相同,但是为了将值保存在文件中,我无法设置精度。感谢有人有解决方案。这是新问题:***.com/questions/64772851/… DecimalType 也采用科学记数法,具体取决于精度和小数位数。【参考方案2】:

DecimalType 在 spark 3.0+ 中已弃用

如果是字符串类型,先转换为 Doubletype,最后转换为 BigInt 类型。无需设置精度:

df.withColumn('total_sale_volume', df.total_sale_volume.cast(StringType).cast(BigIntType))

或者无需导入:

df.withColumn('total_sale_volume', df.total_sale_volume.cast('string').cast('bigint'))

【讨论】:

DecimalType 在 spark 3.0+ 中不被弃用

以上是关于如何在pyspark中关闭科学记数法?的主要内容,如果未能解决你的问题,请参考以下文章

在 Gnuplot 中关闭科学记数法

PySpark - 如何在 csv 输出中删除科学记数法

如何以正确的格式以科学记数法显示 PySpark 数据框中的列

如何在 IBM 的数据科学体验中从 pyspark 访问 postgres 表?

如何在线程中关闭 QWebSocket?

科幻中关于A.I.的纠结