[Athena] Partition ProjectionでNowを使った場合の動作を確認してみた

Amazon AthenaのPartition ProjectionでNOWを使ったとき、どのような動作になるのか調べてみました。
2020.10.29

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

Amazon Athenaには、Partition Projectionがあります。

Partition ProjectionでNOWを使ったとき、どのような動作になるのか調べてみました。

最初に結論

UTC時刻でした。

Partition ProjectionでNOWを使った場合の動作を調べる

調査方法

  1. S3バケットを作成する
  2. AthenaでPartition Projectionを使うテーブルを作成する
  3. S3バケットに未来の日付でファイルを格納する
  4. 上記で格納したファイルの内容がAthenaで確認できるタイミングを調べる

なお、今回は「1日毎」で確認しました。

1. S3バケットを作成する

S3バケットを作成します。

  • バケット名: cm-fujii.genki-athena-partition-projection-bucket

S3バケットを作成する

続いて、下記のサンプルデータをS3バケットに格納します。なお、Kinesis Firehoseが格納する想定としています。

sample_201028.json

{"todoId":"t0001","title":"iPhone 12 Pro Maxを予約する","done":false}
{"todoId":"t0002","title":"醤油を買う","done":false}

S3のKeyは実験時点の2020年10月28日としています。

  • S3-Key: 2020/10/28/08/sample_201028.json

28日分のファイルをS3にアップロードする

2. AthenaでPartition Projectionを使うテーブルを作成する

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

CREATE DATABASE partition_projection_test

続いて、テーブルを作成します。このとき、TBLPROPERTIESでPartition Projectionを使うように設定しています。

CREATE EXTERNAL TABLE IF NOT EXISTS partition_projection_test.sample_table (
  `todoid` string,
  `title` string,
  `done` boolean
)
PARTITIONED BY (
  `dateday` string 
)
ROW FORMAT SERDE
  'org.openx.data.jsonserde.JsonSerDe'
WITH SERDEPROPERTIES (
  'serialization.format' = '1'
)
LOCATION
  's3://cm-fujii.genki-athena-partition-projection-bucket/'
TBLPROPERTIES (
  'has_encrypted_data'='false',
  'projection.enabled' = 'true',
  'projection.dateday.type' = 'date',
  'projection.dateday.range' = '2020/10/01,NOW',
  'projection.dateday.format' = 'yyyy/MM/dd',
  'projection.dateday.interval' = '1',
  'projection.dateday.interval.unit' = 'DAYS',
  'storage.location.template' = 's3://cm-fujii.genki-athena-partition-projection-bucket/${dateday}'
);

テーブル作成後にクエリを実行し、さきほどS3バケットにアップロードしたサンプルデータが見えることを確認します。

SELECT * FROM "partition_projection_test"."sample_table"
WHERE dateday = '2020/10/28'
ORDER BY todoid
LIMIT 10;

無事に見えました!

クエリ実行結果(28日のデータは見える)

3. S3バケットに未来の日付でファイルを格納する

下記のサンプルデータをS3バケットに格納します。

sample_201029.json

{"todoId":"t8888","title":"ブログを書く","done":true}
{"todoId":"t9999","title":"見積書を提出する","done":false}

S3のKeyは、実験時点の翌日である2020年10月29日にしています(時刻は適当)。

  • S3-Key: 2020/10/29/10/sample_201029.json

29日分のファイルをS3にアップロードする

4. 上記で格納したファイルの内容がAthenaで確認できるタイミングを調べる

使うクエリ

SELECT * FROM "partition_projection_test"."sample_table"
WHERE dateday = '2020/10/29'
ORDER BY todoid
LIMIT 10;

クエリ実行結果

時刻(JST) 29日のデータ
10/28 17:23頃(アップロード直後) 見れない
10/28 23:58頃 見れない
10/29 00:01頃 見れない
10/29 08:58頃 見れない
10/29 09:01頃 見れた!!!
29日分のデータが見れない様子

クエリ実行結果(28日のデータは見えない)

29日分のデータが見えた様子

クエリ実行結果(29日のデータが見える)

さいごに

「99%そうだろうな」と思った結果でした。頭の片隅に「おや?」と浮かんだモヤがスッキリすれば幸いです。

参考