pyspark - 在 pyspark 中对小数求和并查看整数
问题描述
我有以下数据框:
from pyspark.sql import functions as f
from pyspark.sql import Window
df = spark.createDataFrame(sc.parallelize([["gr1", "1663708559.71"], ["gr1", "123958300.14"],["gr2", "2006101145.31"]]), ["group_col", "numb"])
我想要一个新列,其中包含按组 col 分组的值的总和。但我没有可读的输出。
df.withColumn("sum_gr", f.sum(df["numb"].cast("double"))).over(Window.partitionBy(df["group_col"]))).show(10, False)
在我计算总和之后,我必须将那个大值与另一个大值进行比较,即使它们相等,我也没有得到匹配。
我有以下结果:对于 gr1:总和是 1.7876668500001E9,我必须将此值与假设 1787666850000.143 进行比较。
在 pyspark 中处理大浮点数时最好的方法是什么?我应该如何将所有小数的整个数字转换为字符串?
解决方案
尝试投射sum
to decimal(38,3)
。请相应地调整精度和比例。
这是一个例子:
df.groupBy('group_Col').agg(F.sum('numb').cast('decimal(38,3)')).show()
#+---------+--------------------------------+
#|group_Col|CAST(sum(numb) AS DECIMAL(38,3))|
#+---------+--------------------------------+
#| gr2| 2006101145.310|
#| gr1| 1787666859.850|
#+---------+--------------------------------+
请检查列的withColumn
语句语法sum_gr
。它在'cast'之后有2个额外的右括号')'。
推荐阅读
- qt - 为什么我不能从 qt creator 调试 qml?
- javascript - 为什么我的 jQuery 动画功能不起作用?
- exception - Haxe 未捕获的全局异常处理程序
- python - Pylint:如何防止打印
- matlab - 使用 FindMatlab.cmake 中的函数
- dart - 如何将十六进制字符串转换为十六进制整数?
- sql - Postgres:关于与隐式冲突目标的冲突
- python - 比较 Pandas Dataframe 中的元素
- c# - 安全问题:将密钥存储为字符串的安全性
- javascript - 如何将一些对象添加到 sendMessage 或将此对象添加到 telegraf.js 库中的 Extra