python - 如何在pyspark中使用round(col(),col())?
问题描述
我想使用这样的ROUND
功能:
CAST(ROUND(CostAmt,ISNULL(CurrencyDecimalPlaceNum)) AS decimal(32,8))
在 pyspark 中。
在 Dataframe 和 SQLROUND
函数中,第一个参数作为数字col
,第二个参数作为int
数字,但我想将第二个参数作为另一列传递。
如果我试图使用第二个参数作为 col 它给出错误column is not callable
。
Pyspark 代码:
round(
col("CostAmt"),
coalesce(col("CurrencyDecimalPlaceNum").cast(IntegerType()), lit(2)),
).cast(DecimalType(23, 6))
如何解决这个问题?
解决方案
该round()
函数接受一个列和一个 int 作为参数:doc。问题是您将 2 列作为参数传递,因为它coalesce
返回一列。
我不确定如何使用合并,我会使用 UDF 并创建一个对数字进行舍入的函数,然后将其应用于两列,如下所示:
from pyspark.sql import SparkSession
import pyspark.sql.functions as F
def round_value(value, scale):
if scale is None:
scale = 2
return round(value, scale)
if __name__ == "__main__":
spark = SparkSession.builder.master("local").appName("Test").getOrCreate()
df = spark.createDataFrame(
[
(1, 1, 2.3445),
(2, None, 168.454523),
(3, 4, 3500.345354),
],
["id", "CurrencyDecimalPlaceNum", "float_col"],
)
round_udf = F.udf(lambda x, y: round_value(x, y))
df = df.withColumn(
"round",
round_udf(
F.col("float_col"),
F.col("CurrencyDecimalPlaceNum"),
),
)
结果:
+---+-----------------------+-----------+---------+
| id|CurrencyDecimalPlaceNum| float_col| round|
+---+-----------------------+-----------+---------+
| 1| 1| 2.3445| 2.3|
| 2| null| 168.454523| 168.45|
| 3| 4|3500.345354|3500.3454|
+---+-----------------------+-----------+---------+
推荐阅读
- windows - 即使我的 PATH 变量已更新,g++ 也无法识别
- reactjs - 如何使用具有不同 Firebase 托管的子域?
- node.js - 如何使我的所有标题元素通过 nginx 到我的节点 js api
- spring-boot - 在控制器中传递服务的功能以不复制 try catch 块
- vue.js - nuxtjs 页面在 nuxtServerInit 完成之前呈现表达式
- android - String is NULL but IsNullOrEmpty function not working
- kotlin - 链接 Lambda - Kotlin
- python - Python Scrapy 脚本在 VSCode 调试器中有效,但在手动运行脚本时无效
- python - 如果在 Python 中匹配字符串(REGEX)中的条件
- termux - Termux:API 'termux-torch on' 不起作用