Redshift Spectrumでは1400年1月1日より古いDATE型は読み込めない

同じエラーに出くわす人いると思ったので書いておきます。

S3にParquet形式で保存したデータをRedshift Spectrumで読み込むと以下のエラーが発生することがあります。

> select * from some_spectrum_table;
Assert
DETAIL:
  -----------------------------------------------
  error:  Assert
  code:      1000
  context:   !(tsval % (USECS_PER_DAY)) - Error fetching values of DATE column. Validate that DATE columns match the corresponding file types. Consider using TIMESTAMP type instead.
  query:     700869
  location:  fetchers.hpp:6304
  process:   query0_125_700869 [pid=22647]
  -----------------------------------------------

AWSサポートに問い合わせたところ、Date型の項目に 1400-01-01 より古い日付を指定すると発生するらしいです。

最初は結構驚いたのですが、1400-01-01 で検索してみると、Date型の実装で結構あるようです。

このあたりとか。

MCMD2: 日付型と時刻型について

とは言え、紙を読み取りデータを自動登録しているような機器を使っている場合など、読み込みエラーなどで1400-01-01より前の変なデータが入ってきてしまうことがゼロとは言えません。そのような異常なデータが1件でもあれば上記のエラーになってしまいクエリがエラーになってしまうのはマズいです。

対策としては可能であれば、Timestamp型やString型に変えることです。

今回はデータの利用側で問題ないことを確認してから、Parquetに変換するGlueのジョブにてDate型にCASTしていたところを、Timestamp型に変換することで解決しました。

今、サービス開発側で対応中とのことで、あくまで2019/06/04現在の情報となります。