DIVIDE_BY_ZERO錯誤類
除零。使用try_divide
容忍除數為0,返回NULL。如果必要的設置<設置>
“假”繞過這個錯誤。
解釋
磚提出這個錯誤當它試圖分裂間隔,或數字0
。這個錯誤隔離對象提供的上下文信息和表達錯誤發生。函數和運算符等國防部,這可能會導致這個錯誤包括那些執行部門作為更複雜的公式的一部分。
緩解
錯誤的減排取決於原因:
導致錯誤的表達是正確的嗎?
如果表達式是錯誤的修複它
0
價值不能發生,重新查詢。數據是否正確?
如果輸入數據應該能夠導致
0
值傳遞,你可能需要解決數據在源或清洗前的數據傳遞給函數作為參數。數據清理可能意味著排除違法的行,將
0
值到零
使用nullif (expr, 0),或者將數據轉換為另一個可接受的使用價值如果(expr = 0, alt, expr)。
如果表達式和數據是正確的,你想除零容忍,你可以使用try_divide。作為一種替代方法,改變參數nullif (expr, 0)。這將會導致表達式返回零
而不是一個錯誤。如果你喜歡你可以問題nvl (try_divide (expr1 expr2)、alt)將生成的零
到另一個值,如中性元素0
或乘法1
。
最後的解決方案,當表達式或數據流不能更改,您可以禁用這個ANSI行為通過設置ansiconfig
來假
。請注意,此設置重要的非即時錯誤條件。
例子
——DIVIDE_BY_ZERO嵌入視圖。上下文信息隔離fai函數。>創建或取代臨時視圖v(c1)作為選擇1/瓦爾從值(1),(0)作為T(瓦爾);>選擇c1從v;(DIVIDE_BY_ZERO]部門通過零。來返回零而不是,使用”try_divide”。如果必要的集“spark.sql.ansi.enabled”來假(除了為ANSI時間間隔類型)來繞過這錯誤。= =SQL的視圖v(行1,位置7)= =選擇1/瓦爾從值(1),(0)作為T(瓦爾)^ ^ ^ ^ ^——由零容忍部門通過將使用try_divide結果為NULL。>創建或取代臨時視圖v(c1)作為選擇try_divide(1,瓦爾)從值(1),(0)作為T(瓦爾);>選擇c1從v;1零——由零容忍部門通過將使用nullif結果為NULL>創建或取代臨時視圖v(c1)作為選擇1/nullif(瓦爾,0)從值(1),(0)作為T(瓦爾);>選擇c1從v;1零——行過濾攻勢>創建或取代臨時視圖v(c1)作為選擇1/瓦爾從值(1),(0)作為T(瓦爾)在哪裏瓦爾! =0;>選擇c1從v;1——除零變成了除一個小數目。>創建或取代臨時視圖v(c1)作為選擇1/如果(瓦爾=0,1e- - - - - -10,瓦爾)從值(1),(0)作為T(瓦爾);>選擇c1從v;110000000000——把除零變成中性元素。>創建或取代臨時視圖v(c1)作為選擇nvl(try_divide(1,瓦爾),0)從值(1),(0)作為T(瓦爾);>選擇c1從v;10——禁用ANSI SQL模式數據磚為視圖定義。>集ANSI_MODE=假;>創建或取代臨時視圖v(c1)作為選擇1/瓦爾從值(1),(0)作為T(瓦爾);>集ANSI_MODE=真正的;>選擇c1從v;1零——禁用磚ANSI模式運行時視圖定義。>集火花。sql。ansi。啟用=假;>創建或取代臨時視圖v(c1)作為選擇1/瓦爾從值(1),(0)作為T(瓦爾);>集火花。sql。ansi。啟用=真正的;>選擇c1從v;1零