SparkSQL で暗黙の型変換を抑制する

automatic type coercing が起きると期待しない結果になることがある。

select if('-999999999999' < 0, true, false) as s, if(-999999999999 < 0, true, false) as i

↑の結果が、s は false, i は true となる。 数字をうっかり文字列のまま使ってる場合、int の範囲を超えた場合に false になる。

こういう暗黙の型変換は困るケースも多いので、spark.sql.ansi.enabled を有効に設定することを検討する。

spark.conf.set("spark.sql.ansi.enabled", "true")

この環境下では、上記のクエリーは invalid input syntax for type numeric: -999999999999 と型変換エラーになる。

https://spark.apache.org/docs/3.4.1/sql-ref-ansi-compliance.html