[小ネタ]dbt-databricksでINCONSISTENT_BEHAVIOR_CROSS_VERSION.DATETIME_WEEK_BASED_PATTERNエラーが発生したときの対処方法
データ事業本部のueharaです。
今回は、dbt-databricks
で INCONSISTENT_BEHAVIOR_CROSS_VERSION.DATETIME_WEEK_BASED_PATTERN
エラーが発生したときの対処方法を紹介したいと思います。
そもそも何のエラーか?
例えば、dbt-databricksで TO_DATE(date_str, 'YYYY-MM-dd')
というようなクエリを実行しようとすると、以下のエラーが発生します。
[INCONSISTENT_BEHAVIOR_CROSS_VERSION.DATETIME_WEEK_BASED_PATTERN] You may get a different result due to the upgrading to Spark >= 3.0:
All week-based patterns are unsupported since Spark 3.0, detected week-based character: Y.
Please use the SQL function EXTRACT instead.
原因について結論から言うと、Spark 3.0以上から 週ベースの年を表す大文字の Y
はサポートされていないためになります。
解決方法
まず、自分が扱いたい年が本当に「週ベースの年」であるか確認する必要があります。
週ベースの年とは、ISO 8601で定義される年の表記方法の1つで、1年を52週または53週で区切って考える方法です(1月1日に最も近い最初の月曜日から始まる=1年の始まりは 12/29〜1/4 の間となる)。
したがって、暦年(1月1日〜12月31日)とは異なる場合がでてきます。
Databricksの Datetime patterns に記載のあるように、通常の年(暦年)を表したい場合は TO_DATE(date_str, 'yyyy-MM-dd')
のように 小文字の y
を利用する必要があります。
本質として、Y
と y
は扱いが異なっています。
その他補足
補足1
真に週ベースの年である Y
を利用したい場合は、以下のようにレガシーオプションを設定することもできます。
SET legacy_time_parser_policy = legacy;
ただし、推奨される方法ではないのでご留意ください。(※ Y
を使わない方向でクエリを修正するべき)
補足2
大文字の D
と 小文字の d
についても同じく扱いが異なります。
大文字の D
は day-of-year
、つまり1年の通算日であり、小文字の d
が day-of-month
つまり月の日を表します。
したがって、例えば TO_DATE('2024-12-18', 'YYYY-MM-DD')
という書式は期待する動作と異なる書式の指定であり、 TO_DATE('2024-12-18', 'yyyy-MM-dd')
という書式が正しいものになります。
最後に
今回は、dbt-databricks
で INCONSISTENT_BEHAVIOR_CROSS_VERSION.DATETIME_WEEK_BASED_PATTERN
エラーが発生したときの対処法を紹介してみました。
参考になりましたら幸いです。