🫶
Athenaで月曜日または月末のパーティションだけ抽出する
S3 Tablesが発表されました。
今後Icebergが当たり前になり、Athenaを使う際のS3フォルダ分けでのパーティションテクニックを忘れちゃうかもしれないので、ここに残します。
前提知識
Athenaでは、↓のようにパーティションを指定することもできますし、
where
-- `=`でパーティションを指定する方法です
-- 以下だと2024年06月24日のパーティションが選択されます
year = '2024'
and month = '06'
and day = '24'
↓のようにパーティションカラムを計算した結果でもパーティションを指定できます
where
-- パーティションカラムを計算した結果でもパーティションを指定できます
-- 以下例はconcat関数で結合した結果が'20240624'であるパーティションが選択されます
concat(year, month, day) = '20240624'
想定するS3のフォルダ構成
- Hive形式でパーティション分割されているとします
- パーティションは
/year=yyyy/month=mm/day=dd/
という形式とします(0埋めされている)
-- ↓のように日次でパーティショニング&保存している
s3://my-demo-bucket/my_table_name/year=2024/month=06/day=24/my_data.parquet
s3://my-demo-bucket/my_table_name/year=2024/month=06/day=25/my_data.parquet
s3://my-demo-bucket/my_table_name/year=2024/month=06/day=26/my_data.parquet
-- ↓のように、year,month,dayでパーティションを定義している
CREATE EXTERNAL TABLE my_table (
id string,
name string,
description string
)
PARTITIONED BY (
year string,
month string,
day string
)
STORED AS parquet
LOCATION 's3://my-demo-bucket/my_table_name/'
Tips: 月曜日のパーティションだけ取得する
select
*
from
my_table
where
-- 月曜日のパーティションを指定します
-- 曜日文字列を計算した結果が、'Monday'であるパーティションを指定します
date_format(
date_parse(concat(year, month, day), '%Y%m%d'),
'%W'
) = 'Monday'
Tips: 月末のパーティションだけ取得する
select
*
from
my_table
where
-- 月末のパーティションを指定します
-- 1日後の日付が「◯月1日」であるパーティションを指定します
date_format(
date_parse(concat(year, month, day), '%Y%m%d') + interval '1' day,
'%d'
) = '01'
Discussion