🫶

Athenaで月曜日または月末のパーティションだけ抽出する

2024/12/11に公開

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'

https://docs.aws.amazon.com/ja_jp/athena/latest/ug/partitions.html

https://prestodb.io/docs/current/functions/datetime.html

Discussion