❄️
Snowflake: python-holidaysを使用して祝日をチェックするUDFを作成する
すでにこちらに同様の趣旨の記事はあるのですが、記事公開の2022年7月時点ではholidaysのバージョンが古く、python-holidaysパッケージをステージにアップロードして使用するやり方を紹介しています。
2023年5月時点では、SnowflakeのAnacondaに含まれるholidaysは0.18となっているので、より簡便にUDFの作成が行えます。
特定日が祝日かどうかをチェック
create or replace function IS_HOLIDAY(day date, ctry varchar)
returns boolean
language python
runtime_version = '3.8'
packages = ('holidays')
handler = 'is_holiday'
as
$$
from holidays import country_holidays
def is_holiday(day, ctry):
ctry_holidays = country_holidays(ctry)
return day in ctry_holidays
$$
;
select IS_HOLIDAY('2023-05-05','JP');
-- TRUE
select IS_HOLIDAY('2023-05-06','JP');
-- FALSE
祝日の一覧
Python UDTFを作成します。UDTFの場合、ハンドラークラスで指定するメソッド名__init__
,process
,end_partition
が決まっています(process
以外はオプショナル)。
create or replace function LIST_HOLIDAYS(
country string, years array
)
returns table(day date, holiday string)
language python
runtime_version = '3.8'
packages = ('holidays')
handler='X'
as
$$
from holidays import country_holidays
class X:
def __init__(self):
pass
def process(self, country, years):
range_years = range(min(years), 1 + max(years))
holidays_dict = country_holidays(
country
, years=range_years
)
return(((k, v) for k, v in holidays_dict.items()))
def end_partition(self):
pass
$$;
select * from table(LIST_HOLIDAYS('JP', [2023,2024])) order by 1;
Discussion