Data pipeline/Airflow

[Airflow] 스케줄 시간 (Crontab) Query 파싱

데이터엔지니어 주형권 2023. 5. 3. 17:31
반응형

안녕하세요. 

 

해당 글을 MySQL 문법을 사용 하였습니다.

 

지난번에 Query를 통해서 Airflow의 스케줄 시간을 파싱 하는 글을 작성하였는데요.  ( 바로가기 )

이번에는 파싱하여 일반 사용자가 보기 편하게 나타내는 Query를 만들었습니다. 

 

결과물

 

위와 같이 Crontab시간을 사용자가 보기 편한 형태로 보여 주도록 하였습니다. 

아무래도 규치적을 주고 파싱을 하다 보니 영어 표현과 어순이 조금 어색하거나 안 맞는 경우가 있습니다.

이 부분은 감안해 주세요. (도저히.. 어떻게 바꿀지 모르겠습니다.)

 

SELECT schedule_interval
        ,CASE WHEN schedule_interval = '"@once"' THEN 'Schedule once and only once'
              WHEN schedule_interval = '"@daily"' THEN 'Run once a day at midnight'
              WHEN schedule_interval = '"None"' THEN 'Don’t schedule, use for exclusively “externally triggered” DAGs'
              WHEN schedule_interval = '"@hourly"' THEN 'Run once an hour at the beginning of the hour'
              WHEN schedule_interval = '"@weekly"' THEN 'Run once a week at midnight on Sunday morning'
              WHEN schedule_interval = '"@monthly"' THEN 'Run once a month at midnight of the first day of the month'
              WHEN schedule_interval = '"@yearly"' THEN 'Run once a year at midnight of January 1'
         ELSE 
            CONCAT('Run at '
            ,CASE WHEN `hour` = '*' THEN ' Every hour ' WHEN `hour` LIKE '%/%' THEN CONCAT(' every ',REPLACE(`hour`,'*/',''),' hour ') ELSE CONCAT(`hour`,' hour ')END
            ,CASE WHEN `minute` = '*' THEN ' every minute ' WHEN `minute` LIKE '%/%' THEN CONCAT(' every ',REPLACE(`minute`,'*/',''),' minute ') ELSE CONCAT(`minute`,' minute ')END
            ,CASE WHEN `day_of_week` = '*' THEN ' every day ' ELSE CONCAT(' from ',`day_of_week`)END
            ,CASE WHEN `month` = '*' THEN '' ELSE CONCAT(`month`,', month ')END
            ,CASE WHEN `day` = '*' THEN '' ELSE CONCAT(`day`,' th ')END
            )
         END AS schedule_interval_parse
FROM 
    (
    SELECT   SUBSTRING_INDEX(REPLACE (schedule_interval,'"',''),' ',1)AS `minute`
            ,SUBSTRING_INDEX(SUBSTRING_INDEX(REPLACE (schedule_interval,'"',''),' ',2),' ',-1)AS `hour`
            ,SUBSTRING_INDEX(SUBSTRING_INDEX(REPLACE (schedule_interval,'"',''),' ',3),' ',-1)AS `day`
            ,SUBSTRING_INDEX(SUBSTRING_INDEX(REPLACE (schedule_interval,'"',''),' ',4),' ',-1)AS `month`
            ,REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(SUBSTRING_INDEX(SUBSTRING_INDEX(REPLACE (schedule_interval,'"',''),' ',5),' ',-1),0,'Sunday'),1,'Monday'),2,'Tuesday'),3,'Wednesday'),4,'Thursday'),5,'Friday'),6,'Saturday')
                AS `day_of_week`
            ,schedule_interval
    FROM (
        SELECT '"48 * * * *"' AS schedule_interval UNION ALL 
        SELECT '"30 */4 * * *"' UNION ALL 
        SELECT '"@once"' UNION ALL
        SELECT '"15 1 * * *"' UNION ALL
        SELECT '"30 1 * * 1"' UNION ALL
        SELECT '"30 5 * 3 1"' 
        )AS T1
    )AS T2

 

위의 Query를 이용해서 누구나 쉽게 볼 수 있는 Airflow의 시간표를 만들 수 있습니다.

 

감사합니다.

반응형