接下來,說說 Variable 的一些用法,先從簡單的開始
在 web 介面裡有一個地方可以設定,如圖所示
Admin
→ Variables
接下來就能看到相關的介面,很直覺
按下 + 號就能新增 variable,設定 key、val、跟說明
在 Actions 裡面,也有 Delete 跟 Export 功能。可以讓我們將已存在的 variable 做批次的刪除或是匯出。
有匯出當然就有匯入,這裡的匯出預設是 json 格式,我們可以將開發環境中的 variable 先匯出,等到正式環境時再做點小修改後匯入。
新增 variable 時,val 有兩種寫法。第一種就直接寫,你可以寫 int 數字、string 字串,或是 True / False。
第二種就要稍微懂一點 json,例如你可以輸入
{
"vInt": 1,
"vStr": "abc"
}
在 DAG 使用時會略有不同。以下分開說明
如果是直接寫一級變數,在 DAG 內可以這樣寫:
Variable.get("KEY", "I'm default")
或是用樣板模式
{{var.value.KEY}}
這樣就能取得了,個人比較喜歡第一種能設定 default 值的,不過有時候樣板也是很好用
如果是寫 json 格式的話,要調整一點小地方
Variable.get("KEY2", '[1,2,3]',``deserialize_json=True)
或是用樣板模式
{{var.json.KEY2}}
這樣的話,你取得的時候就會先經過 json 轉換成 object,這個適用於比較多層的變數或是 array。
在 terminal 內,我們可以下指令去控制 Variable
airflow variables -h
可以看到有哪些相關的指令可以使用
可以看到跟 web 介面功能大同小異。但知道有這些指令可以下,之後在做 CI/CD 時可以做點手腳讓不同環境的變數可以部署時自動匯入,減少人為操作。
我個人建議 json 只用在 array 上,其他的 variable 盡量使用 value 的單層寫法。原因有兩個:
一、維護簡單:json 雖然易讀但不代表就易寫,真的要修改的時候可能不小心就把格式改壞了。
二、強迫單純:Variable 這種全域物件就像 static 一樣,不是一個太好的 pattern。誠然有時候確實有依環境不同設定的情境,但寫得太過複雜,會讓人有慣性將參數放在裡面,而不是好好的設計物件架構。