kettle從入門到精通 第七十三課 ETL之kettle kettle呼叫http分頁介面教程

慕容尘轩發表於2024-06-22

場景: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是個非常靈活的工具,這裡只是提供了一個思路而已,大家如果有更好的實現思路,評論區或者溝通交流群告訴我。

相關文章