首页 > 解决方案 > 如何在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))

如何解决这个问题?

标签: pythonapache-sparkhadooppysparkapache-spark-sql

解决方案


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|
+---+-----------------------+-----------+---------+

推荐阅读