問題
你想給一個或更多的價值小數使用相同值的精度和規模。返回一個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))
返回預期的結果: