在什麼場景中使用富函數?
許多時候我們需要在函數處理第一條記錄之前就進行一些初始話工作或是取得函數運行時相關的上下文信息。
如何使用富函數?
我定義了一個map算子,現在我如果要在map算子在處理第一條記錄之前,就想取得該函數運行時的相關信息,和進行一些初始話工作。那麼代碼就應當類似於如下方式:
**.map(x=> 定義一個富函數)
富函數中的方法open()/close()
在使用富函數的時候,我們可以對函數的生命週期實現兩個額外的方法:
- open():
- 是富函數的初始方法。它在每個任務首次調用轉換方法(如map,flter等算子)前調用一次。Open方法通常只用於那些只需要進行一次的設置工作
- close():
- 函數的終止方法,會在每個任務最後一次調用轉換方法後調用一次。通常用於清理和釋放資源。
- 此外,還可以使用getRuntimeContext()方法來訪問函數的RuntimeContext,從RuntimeContext中獲取一些信息,例如函數的並行度,訪問分區狀態的方法等… …
如何通過代碼實現一個富函數?
舉例:
我想要在使用map算子處理計算的時候,連接數據庫,這個連接的代碼只會運行一次,後續不會再運行,就可以利用富函數的初始話方法來進行定義.
這裏我以flatMap富函數舉例:
class flatMap_rich extends RichFlatMapFunction<In,Out>{
override def open(configuration:Confuration) : kic Unit = {} //創建初始話函數,例如創建和外部系統的連接
override def flatMap(in : In,out:Collector<Out>)() :Unit = {} //做一些操作
override def close : Unit = {} //做一些清理工作,例如關閉和外部系統的連接
}