spark dataframe 使用cast 时输出结果不正确

问题描述 投票:0回答:1

当使用spark dataframe时,当cast()函数被调用为decimal(38,16)时,结果,它计算的不是最多16位小数,而是最多14个字符,并用零填充其余部分

单位代码如下:

  avg(
        when((col("a.is_debtor") == 1) & (col("a.is_kk") == 0) & (col("a.is_open") == 0),
             datediff(col("a.date_end_plan"), col("a.date_end_fact")) / (365.25 / 12)
        )
    ).cast(DecimalType(38, 20)).alias("loan_avg_plan_fact_closed_mm_cnt")

结果输出如下结果:

|loan_avg_plan_fact_closed_mm_cnt|
+--------------------------------+
|19.3593429158110900        
+--------------------------------+

但是,结果应该是这样的:

|loan_avg_plan_fact_closed_mm_cnt|
+--------------------------------+
|19.3593429158110870      
+--------------------------------+

我尝试将 CAST 放在代码中任何可能的位置,但无济于事。有趣的是,如果你删除除法(365.25/12),结果将是正确的。请帮助我,我已经为这个错误苦苦挣扎了一个星期

sql apache-spark amazon-s3 apache-spark-dataset
1个回答
0
投票

您可能已经发现了问题,证明如果没有可重现的示例案例,这将是困难的。

(365.12/12) 是 DoubleType 而不是 DecimalType。将其转换为十进制,并在其周围进行另一个转换 38,20 以保留所有十进制。

如果这不是解决方案,您最好的办法是显示实际使用的表达式(有时字符串 df.explain(true) 就足够了),在 DF 上使用调试并查看查询计划,这将显示强制转换的位置正在添加中。通常,您会看到一些 Spark 内部关于小数处理的规则(例如,为了防止溢出等)在您的强制转换周围添加了额外的强制转换。这些也作为 3.4 的一部分进行了更改。

© www.soinside.com 2019 - 2024. All rights reserved.