掲題のエラーに当たってサポートに対応教えてもらったのでメモ。
事象
CSVをGlueを使ってパーティション分割して、AthenaでプレビューしてみたらHIVE_PARTITION_SCHEMA_MISMATCHというエラーが発生しました。
SELECT * FROM "tablename" limit 10;
Your query has the following error(s): HIVE_PARTITION_SCHEMA_MISMATCH: There is a mismatch between the table and partition schemas. The types are incompatible and cannot be coerced. The column 'dropoff_longitude' in table 'yellow.csv_gzip' is declared as type 'string', but partition 'year=2015/month=12/day=31' declared column 'dropoff_longitude' as type 'double'.
原因
エラーメッセージの通りなのですが、Glueのスキーマ情報はテーブルとパーティションで別々に持っているので、そこに差異が出てしまっているというものでした。
パーティションの例
こんな感じでパーティション切ってました。
s3://bucket/csv/Year=2015/Month=12/Day=04/file
テーブルのスキーマ
Glueの画面から Databases > Tables > Schema
で確認できます。
dropoff_longitude: string
パーティション毎のスキーマ
パーティションのスキーマを確認すると DoubleとStringが混在していることがわかりました。
Databases > Tables > Schema > View partitions > 該当のパーティション > View properties
dropoff_longitude: double
対応
「新規列のみを追加します」
と 「すべての新規および既存のパーティションをテーブルからのメタデータで更新します」
の設定を入れてクローラを回すことで、テーブルのスキーマがパーティションに継承されるようになります。
今回はDoubleにしたかったので、テーブルのスキーマをDoubleに変更してからクローラを上記設定で再実行したところHIVE_PARTITION_SCHEMA_MISMATCHのエラーは解消されました。