この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
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が格納する想定としています。
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
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バケットに格納します。
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
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%そうだろうな」と思った結果でした。頭の片隅に「おや?」と浮かんだモヤがスッキリすれば幸いです。