AthenaでHIVE_PARTITION_SCHEMA_MISMATCHが発生 GlueカタログのTableとPartitionの間のスキーマに不整合直して解消

掲題のエラーに当たってサポートに対応教えてもらったのでメモ。

事象

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のエラーは解消されました。

参考

Athena と AWS Glue を併用する際のベストプラクティス - Amazon Athena