gpt4 book ai didi

scala - 转换时 Spark 小数精度和比例似乎是错误的

转载 作者:行者123 更新时间:2023-12-04 15:39:59 24 4
gpt4 key购买 nike

阅读文档,Spark DataType BigDecimal(precision, scale) 意味着

  • 精度 是总位数和
  • Scale 是小数点后的位数。

  • 所以当我将一个值转换为十进制时
    scala> val sss = """select cast(1.7142857343 as decimal(9,8))"""
    scala> spark.sql(sss).show
    +----------------------------------+
    |CAST(1.7142857343 AS DECIMAL(9,8))|
    +----------------------------------+
    | 1.71428573| // It has 8 decimal digits
    +----------------------------------+

    但是当我将值转换为 10.0 以上时,我得到 NULL
    scala> val sss = """select cast(12.345678901 as decimal(9,8))"""
    scala> spark.sql(sss).show
    +----------------------------+
    |CAST(11.714 AS DECIMAL(9,8))|
    +----------------------------+
    | null|
    +----------------------------+

    我希望结果是 12.3456789
  • 为什么是NULL?
  • 为什么没有实现 Precision?
  • 最佳答案

    转换十进制 Spark 在内部验证提供的模式十进制(9,8)比实际模式十进制(11,9)宽 12.345678901。如果是,则意味着可以安全地将数字转换为提供的模式,而不会丢失任何精度或范围。看看 org.apache.spark.sql.types.DecimalType.isWiderThan()

    但是,在上述情况下,decimal(11,9) 不能转换为 decimal(9,8),因此它返回 null。

    //MAX_PRECISION = 38
    val sss = """select cast(12.345678901 as decimal(38,7))"""
    spark.sql(sss1).show(10)
    +-----------------------------------+
    |CAST(12.345678901 AS DECIMAL(38,8))|
    +-----------------------------------+
    | 12.3456789|
    +-----------------------------------+

    关于scala - 转换时 Spark 小数精度和比例似乎是错误的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58142233/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com