S3バケットのファイルを上書きした際のAthena動作を確認する

S3バケットのファイルをAmazon Athenaで取得するとき、「S3バケットのファイルを上書きしても直ぐに反映される?」か気になったので試してみました。
2020.11.27

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

S3バケットに置いたCSVファイルやJSONファイルをAmazon Athenaで確認することがあります。 そこでふと気になりました。ファイルを上書き(または削除してから追加)した場合、ちゃんと反映されるのだろうか?)と。 試してみました。

おすすめの方

  • S3のファイルを上書き(または削除&追加)した際のAthena動作を知りたい方

最初に結論

  • S3のファイルを上書き(または削除&追加)したとき、新しいファイルの内容が取得できる

CSVファイルで試してみる

S3バケットへのアップロード(CSV)

S3バケットにCSVファイルをアップロードします。

sample.csv

time,user,level
2020-11-23,aaa,111
2020-11-23,bbb,333
2020-11-24,aaa,113
2020-11-25,aaa,115
2020-11-25,bbb,334
  • アップロード先:s3://cm-fujii.genki-athena-test/test/sample.csv

Athenaテーブルの作成

まずは適当にデータベースを作成します。

CREATE DATABASE overwrite_test

続いてテーブルを作成します。

CREATE EXTERNAL TABLE IF NOT EXISTS overwrite_test.csv_test_table (
  `time` date,
  `user` string,
  `level` int
)
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe'
WITH SERDEPROPERTIES (
  'serialization.format' = ',',
  'field.delim' = ','
) LOCATION 's3://cm-fujii.genki-athena-test/test/'
TBLPROPERTIES ('has_encrypted_data'='false', 'skip.header.line.count'='1');

データ取得

データ取得してみます。バッチリ取得できました。

SELECT * FROM "overwrite_test"."csv_test_table" limit 10;

CSVファイルを上書きし、データ取得する

S3バケットのCSVファイルを上書きします。

sample.csv

time,user,level
2020-12-13,xxx,1111
2020-12-13,yyy,2222
2020-12-14,xxx,3333
2020-12-15,xxx,4444
2020-12-15,zzz,5555

テーブルの再作成などは行わず、そのままデータ取得してみます。

SELECT * FROM "overwrite_test"."csv_test_table" limit 10;

上書きしたCSVファイルの内容が取得できました。

CSVファイルを削除してから追加し、データ取得する

CSVファイルを削除し、Athenaでデータ取得します。

SELECT * FROM "overwrite_test"."csv_test_table" limit 10;

取得したデータは0件でした。

このまま新しいCSVファイルをアップロードします。

sample.csv

time,user,level
2000-10-03,foo,11
2000-10-03,bar,22
2000-10-04,bar,33
2000-10-05,foo,44
2000-10-05,bar,55

テーブルの再作成などは行わず、そのままデータ取得してみます。

SELECT * FROM "overwrite_test"."csv_test_table" limit 10;

アップロードしたCSVファイルの内容が取得できました。

さいごに

ふと疑問に思ったので試してみました。十中八九問題ないと考えていましたが、実際にそのとおりで安心です。