[Athena] Partition ProjectionでNowを使った場合の動作を確認してみた
Amazon Athenaには、Partition Projectionがあります。
Partition ProjectionでNOW
を使ったとき、どのような動作になるのか調べてみました。
最初に結論
UTC時刻でした。
Partition ProjectionでNOWを使った場合の動作を調べる
調査方法
- S3バケットを作成する
- AthenaでPartition Projectionを使うテーブルを作成する
- S3バケットに未来の日付でファイルを格納する
- 上記で格納したファイルの内容がAthenaで確認できるタイミングを調べる
なお、今回は「1日毎」で確認しました。
1. S3バケットを作成する
S3バケットを作成します。
- バケット名: cm-fujii.genki-athena-partition-projection-bucket
続いて、下記のサンプルデータをS3バケットに格納します。なお、Kinesis Firehoseが格納する想定としています。
{"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
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;
無事に見えました!
3. S3バケットに未来の日付でファイルを格納する
下記のサンプルデータをS3バケットに格納します。
{"todoId":"t8888","title":"ブログを書く","done":true} {"todoId":"t9999","title":"見積書を提出する","done":false}
S3のKeyは、実験時点の翌日である2020年10月29日にしています(時刻は適当)。
- S3-Key: 2020/10/29/10/sample_201029.json
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日分のデータが見れない様子
29日分のデータが見えた様子
さいごに
「99%そうだろうな」と思った結果でした。頭の片隅に「おや?」と浮かんだモヤがスッキリすれば幸いです。