0 函數
Flink 允許用戶在 Table API 和 SQL 中使用函數進行數據的轉換。
1 函數類型
Flink 中的函數有兩個划分標准。
一個划分標准是:系統(內置)函數和 Catalog 函數。系統函數沒有名稱空間,只能通過其名稱來進行引用。 Catalog 函數屬於 Catalog 和數據庫,因此它們擁有 Catalog 和數據庫命名空間。 用戶可以通過全/部分限定名(catalog.db.func
或 db.func
)或者函數名 來對 Catalog 函數進行引用。
另一個划分標准是:臨時函數和持久化函數。 臨時函數始終由用戶創建,它容易改變並且僅在會話的生命周期內有效。 持久化函數不是由系統提供,就是存儲在 Catalog 中,它在會話的整個生命周期內都有效。
這兩個划分標准給 Flink 用戶提供了 4 種函數:
- 臨時性系統函數
- 系統函數
- 臨時性 Catalog 函數
- Catalog 函數
請注意,系統函數始終優先於 Catalog 函數解析,臨時函數始終優先於持久化函數解析, 函數解析優先級如下所述。
2 函數引用
用戶在 Flink 中可以通過精確、模糊兩種引用方式引用函數。
2.1 精確函數引用
精確函數引用允許用戶跨 Catalog,跨數據庫調用 Catalog 函數。 例如:select mycatalog.mydb.myfunc(x) from mytable
和 select mydb.myfunc(x) from mytable
。
僅 Flink 1.10 以上版本支持。
2.2 模糊函數引用
在模糊函數引用中,用戶只需在 SQL 查詢中指定函數名,例如: select myfunc(x) from mytable
。
3 函數解析順序
當函數名相同,函數類型不同時,函數解析順序才有意義。 例如:當有三個都名為 “myfunc” 的臨時性 Catalog 函數,Catalog 函數,和系統函數時, 如果沒有命名沖突,三個函數將會被解析為一個函數。
3.1 精確函數引用
由於系統函數沒有命名空間,Flink 中的精確函數引用必須 指向臨時性 Catalog 函數或 Catalog 函數。
解析順序如下:
- 臨時性 catalog 函數
- Catalog 函數
3.2 模糊函數引用
解析順序如下:
- 臨時性系統函數
- 系統函數
- 臨時性 Catalog 函數, 在會話的當前 Catalog 和當前數據庫中
- Catalog 函數, 在會話的當前 Catalog 和當前數據庫中