Flink SQL执行除法时抛出ArithmeticException问题求助
解决Flink SQL中除法运算的ArithmeticException异常
嘿,我之前也碰到过Flink SQL里的这个算术异常问题,来帮你捋清楚怎么解决~
你遇到的ArithmeticException: on-terminating decimal expansion no exact representable decimal result异常,本质是因为Flink在处理decimal类型的除法运算时,结果无法用decimal类型精确表示(比如无限循环小数)。虽然你的语句里是除以100.0(理论上结果都是有限小数),但Flink的类型推断规则可能把运算双方都识别为decimal类型,触发了严格的精确性校验,从而抛出异常。
下面是几个直接有效的解决办法:
方法一:转换为浮点数类型运算
将计数结果显式转为DOUBLE类型,避开decimal的精确性限制:SELECT productId, COUNT(order), CAST(COUNT(order) AS DOUBLE)/100.0 FROM product GROUP BY productId方法二:用ROUND函数指定小数位数
如果需要保留decimal类型的精度,可以通过ROUND函数强制指定结果的小数位数,截断或四舍五入后就能避免无法精确表示的问题:SELECT productId, COUNT(order), ROUND(COUNT(order)/100.0, 2) FROM product GROUP BY productId方法三:显式转换除数类型
把除数100.0转为DOUBLE,让运算以浮点数规则执行:SELECT productId, COUNT(order), COUNT(order)/CAST(100 AS DOUBLE) FROM product GROUP BY productId
另外,你也可以检查Flink的decimal默认配置(比如table.decimal.default-precision和table.decimal.default-scale),调整全局的精度和小数位数,但前面的方法针对单个SQL语句更灵活。
内容的提问来源于stack exchange,提问作者yinhua
相关产品推荐
相关产品推荐

