場景:kettle呼叫http介面獲取資料(由於資料量比較大,鑑於網路和效能考慮,所以介面是個分頁介面)。
方案:構造頁碼list,然後迴圈呼叫介面。
1、總體設計
1)、初始化分頁引數pageNum=1,pageSize=20,這裡的pageSize可以根據自己的需求自行調整,比如每次從介面取數100或者1000等等。
2)、第一次請求分頁介面,然後儲存資料&獲取總頁數。
3)、根據總分頁資料,然後計算出頁碼list。
4)、迴圈頁碼list,單條資料請求http介面。
注:2和4呼叫的是同一個子trans
2、初始化分頁引數
1)這裡為了演示方便,使用的生成記錄生成了一條資料,其中pageNum=1,pageSize=50
2)這裡的pageSize可以根據自己的需求自行調整,比如每次從介面取數100或者1000等等。
3)實際業務場景中有可能用不到生成記錄步驟,這個大家根據自己場景進行選擇。
3、第一次請求http介面
1)從以前的結果獲取記錄步驟獲取初始化的引數pageNum=1和pageSize=20
2)這裡的模擬http請求使用的是寫日誌步驟,具體場景中使用的是http post步驟。
3)這裡的模擬http響應資料落地是空步驟,具體場景中應該是json input、table output等步驟。
4)模擬介面返回的總頁數這裡使用的是增加常量,具體使用時應該從json input步驟解析出來totalNum欄位。具體的業務場景總頁數字段可能不叫totalNum,根據實際情況填寫即可。
4、計算頁碼list
1) 這一步很重要,將單條資料變成list,如上一步的totalNum為3,這裡會輸出[{"paggNum":"2","pageSize":"20"},{"paggNum":"3","pageSize":"20"}]
2) 指令碼如下
var max_page_int = str2num(totalNum); for(var curr_page=2;curr_page<=max_page_int;curr_page++){ var outputRow = new Array(_step_.getOutputRowMeta().size()); outputRow[_step_.getOutputRowMeta().indexOfValue("pageNum")] = num2str(curr_page); outputRow[_step_.getOutputRowMeta().indexOfValue("pageSize")] = pageSize; _step_.putRow(_step_.getOutputRowMeta(), outputRow); } var trans_Status = SKIP_TRANSFORMATION;
5、迴圈請求http介面(從第二頁開始)
1)這裡一定要勾選執行每一個輸入行,勾選之後才會執行for迴圈操作。會迴圈上一步的結果[{"paggNum":"2","pageSize":"20"},{"paggNum":"3","pageSize":"20"}]
2)這一步呼叫子trans和第一次請求http介面的子trans是一樣的。細心的朋友可能會發現其實只有第一次請求http介面之後才關心totalNum,之後的請求都不會關心這個totalNum。
注:kettle是個非常靈活的工具,這裡只是提供了一個思路而已,大家如果有更好的實現思路,評論區或者溝通交流群告訴我。