Athenaで元データのカラム数とテーブル定義が一致しない時どのような挙動になるか

概要

ある日のデータからカラムが追加されることになった。
その時、Athenaではどのようなデータが表示されることになるのだろうか

テスト準備

  • csvファイルを2つ作成(Athenaに対応しているファイル形式なら何でもよい)
    • まずは下記カラムのファイルをここで作成した
price name
int string
  • 上記カラムのファイルの末尾に、country(string)のカラムを追加したcsvファイルを作成
  • S3
    • 特定バケットディレクトリを2つ作成(dir=1, dir=2など、Athenaのパーティンションで使えるような名前で)
    • まとめると、それぞれのディレクトリのファイルには下記のカラムが存在する
hr1 hr2
price, name price, name, country
  • Athena
    • カラム追加前後、それぞれのテーブルを作成する
    • Load partitionsを実行して、Athenaにパーティションを認識させる

テスト内容と結果

テーブル毎にSELECTするカラムと読み取るパーティション、その実行結果を出すと下記の通り

  • 追加前のカラムが定義されているテーブル(price, name)
SELECTするカラム / 読み取るパーティション hr1(price,name) hr2(price,name,country) hr1 と hr2 両方
price, name price,nameの値が取得可能 price,nameの値が取得できる price,nameの値が取得できる
price, name, country countryが定義されていないのでエラー countryが定義されていないのでエラー countryが定義されていないのでエラー
  • 追加後のカラムが定義されているテーブル(price, name, country)
SELECTするカラム / 読み取るパーティション hr1(price,name) hr2(price,name,country) hr1 と hr2 両方
price, name price,nameの値が取得可能 price,nameの値が取得できる price,nameの値が取得できる
price, name, country price, nameの値を取得
countryは空白で出力
price, nameの値を取得 price, nameの値を取得
データにcountryがあれば取得、なければ空白

まとめ

  • ある時点から元データのカラムは増やしてよい
  • それに合わせてAthenaのテーブルカラムも増やしてよい
    • 元データに存在しないカラムをSELECTしても、空白で出力されるだけでエラーにならない
    • 空白があってもそのカラムに対してSUM()等の関数は実行できる