【问题标题】:how to use round(col(),col()) in pyspark?如何在pyspark中使用round(col(),col())?
【发布时间】:2023-03-15 18:26:02
【问题描述】:

我想像这样使用ROUND 函数:

CAST(ROUND(CostAmt,ISNULL(CurrencyDecimalPlaceNum)) AS decimal(32,8))

在 pyspark 中。

在 Dataframe 和 SQL 中,ROUND 函数将第一个参数作为 col,第二个参数作为 int 数字,但我想将第二个参数作为另一列传递。

如果我尝试将第二个参数用作 col,则会给出错误 column is not callable

Pyspark 代码:

round(
        col("CostAmt"),
        coalesce(col("CurrencyDecimalPlaceNum").cast(IntegerType()), lit(2)),
    ).cast(DecimalType(23, 6))

如何解决这个问题?

【问题讨论】:

    标签: python apache-spark hadoop pyspark apache-spark-sql


    【解决方案1】:

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

    【讨论】:

    • 谢谢。我会试试这个解决方案
    猜你喜欢
    • 2023-03-21
    • 1970-01-01
    • 2022-08-04
    • 1970-01-01
    • 2017-03-02
    • 1970-01-01
    • 2019-06-19
    • 1970-01-01
    相关资源
    最近更新 更多