事象
AthenaのDDLでパーティションを指定しても、それだけでは実際のSELECTクエリで結果は返ってきません。これはGlueのAPIでCREATE TABLEした場合でも同様です。
解決策
DDL実行後に下記クエリを実行する。
MSCK REPAIR TABLE table_name
これは解決策というよりか普通に必要な手順になります。以下公式Docsにも記載されています。
https://docs.aws.amazon.com/ja_jp/athena/latest/ug/partitions.html
解説
CREATE TABLEしただけでは、そのパーティションキーがこのテーブルにはあるよ、という情報がデータカタログに渡されるだけで、実際にそのパーティションキーにはどんな値のものがあるかということが知らされないため、パーティションキーはスキーマに記載されているがパーティションはカタログ上存在しないという状態になります。
例えばname
というパーティションキーがスキーマに登録されても、実際のパーティションにname=yamada
とかname=sato
があるかどうかはカタログ側はまだ知らないのでパーティション使えませんという状態ということです。
なのでMSCK REPAIR TABLE
コマンドでS3パスと照合して実際に存在するパーティションをスキャンしてメタ情報がカタログに登録され、ようやくクエリできるということです。
その他
上記のコマンドは自動的にパーティションをスキャンさせる方法ですが、単体のパーティションを個別で登録するにはALTER TABLE table_name ADD PARTITION xxxxxx
を使う方法があります。