问题
你想给一个或更多的价值小数使用相同值的精度和规模。返回一个null值的期望值。
这个示例代码:
% sql SELECT铸造(5.345小数(20、20))
返回:
导致
的小数类型(AWS|Azure|GCP)被声明为小数(精度、规模),精度和等级是可选的。
精密代表数字的总数在变量的值。这包括整数部分和小数部分。
代表的数量规模变量的值的小数位数。简而言之,这是数量的数字的小数点向右。
例如,123.45有一个数量精度五个(总共有五位数)和一个规模两个(只有两个数字小数点右边)。
当精度和等级是相等的,这意味着值小于1,因为所有数字用于数的小数部分。例如,小数(20、20)定义了一个价值20数字和20个数字的小数点向右。所有20位用来表示数量的小数部分,没有数字用于整数。
如果精度值溢出数据类型声明中定义的精度,将返回空值而不是分数的十进制值。
解决方案
集spark.sql.ansi.enabled来真正的在集群的火花配置(AWS|Azure|GCP)。
这使火花SQL ANSI合规。
有关更多信息,审查ANSI合规文档。
一旦启用了ANSI合规,通过不正确的精度和等级值返回一个错误指示正确的值。
例如,此示例代码:
% sql SELECT铸造(5.345小数(20、20))
返回这个错误信息:
在SQL语句错误:SparkArithmeticException (CANNOT_CHANGE_DECIMAL_PRECISION):小数(扩大,5.345,4,3)不能被表示成小数(20、20)。
然而,此示例代码:
选择演员(5.345小数(4,3))
返回预期的结果: