パーティション射影でパーティションの場所をパーティションキーにマッピングする方法を指定できます。前のセクションの CREATE TABLE
の例では、日付と時刻を datehour という 1 つのパーティションキーにまとめましたが、他のスキームも可能です。例えば、パーティションキーを year、month、day、hour に分けてテーブルを構成することもできます。
ただし、日付を年、月、日に分割すると、date
パーティション投影タイプは使用できなくなります。別の方法として、日付と時間を分離して date
パーティション投影タイプを引き続き活用する方法がありますが、時間の範囲を指定するクエリは読みやすくします。
それを考慮して、次の CREATE TABLE
の例では、日付と hour を分けています。date
は SQL の予約語であるため、この例では日付を表すパーティションキーの名前として day
を使用します。
CREATE EXTERNAL TABLE my_ingested_data2 (
...
)
...
PARTITIONED BY (
day STRING,
hour INT
)
LOCATION "s3://amzn-s3-demo-bucket/prefix
/"
TBLPROPERTIES (
"projection.enabled" = "true",
"projection.day.type" = "date",
"projection.day.format" = "yyyy/MM/dd",
"projection.day.range" = "2021/01/01,NOW",
"projection.day.interval" = "1",
"projection.day.interval.unit" = "DAYS",
"projection.hour.type" = "integer",
"projection.hour.range" = "0,23",
"projection.hour.digits" = "2",
"storage.location.template" = "s3://amzn-s3-demo-bucket/prefix
/${day}/${hour}/"
)
CREATE TABLE
ステートメントの例では、hour は独立したパーティションキーで、整数に設定されています。hour パーティションキーの設定では、0~23 の範囲が指定され、Athena がパーティションの場所を生成するときに、hour を 2 桁でフォーマットする必要があります。
my_ingested_data2
テーブルのクエリは次の例のようになります。
SELECT *
FROM my_ingested_data2
WHERE day = '2021/11/09'
AND hour > 3
パーティションキーとパーティション射影データ型を理解する
最初の CREATE TABLE
の例の datehour
キーは、パーティション射影の設定では date
として設定されていますが、パーティションキーの型は string
なので、注意してください。2 番目の例の day
についても同様です。パーティション射影に設定されている型は、Athena がパーティションの場所を生成するときの値のフォーマット方法のみを指示します。指定する型によって、パーティションキーの型は変更されません。クエリでは、datehour
と day
は string
型です。
クエリに day = '2021/11/09'
のような条件が含まれている場合、Athena はパーティション射影設定で指定された日付形式を使用して、式の右辺の文字列を解析します。Athena は、日付が設定された範囲内であることを確認した後、日付形式を再び使用して日付を文字列として保存場所テンプレートに挿入します。
同様に、day > '2021/11/09'
のようなクエリ条件の場合、Athena は右辺を解析し、設定された範囲内で一致するすべての日付のリストを生成します。次に、日付形式を使用して各日付を保存場所テンプレートに挿入し、パーティションの場所のリストを作成します。
day > '2021-11-09'
や day >
DATE '2021-11-09'
と同じ条件を書くと動作しません。最初のケースでは、日付形式が一致せず (スラッシュではなくハイフンになっていることに注意してください)、2 番目のケースでは、データ型が一致しません。