在kettle中使用遍歷來更新記錄中的字段


數據庫中有訂單表tb_order,其中有order_id和user_id和user_name等字段。
數據庫中有用戶資料表tb_user,其中有user_id和user_name等字段。
現在需要使用tb_user.user_name來更新tb_order.user_name,兩個表的關聯條件是tb_order.user_id = tb_user.user_id。
通常,在兩個表都靜止的時候,可以使用一個update來解決,如下。

update tb_order
set user_name = (select user_name from tb_user u where u.user_id = tb_order.user_id);
但是,如果這兩個表的數據量較大,且兩個表都在生產頻繁使用的時候,一個update語句會鎖表,且需要較長的時間,從而可能會導致正常的業務無法快速進行。
此時,就應該單獨遍歷tb_order表中的每一條記錄,然后根據tb_order.user_id去tb_user中查詢每一條記錄中的user_name,最后根據tb_order.order_id來更新tb_order.user_name;這個單獨遍歷的方式,雖然不能完全解決鎖表引起的問題,但是也可以較大概率避免。
一下是一個用遍歷記錄的思路處理問題的kettle配置,這個配置模式,效率非常低。
思路如下:
1:將tb_order表中數據讀入內存
2:從內存中獲得一個記錄中的字段值,並將這些值設置成kettle的變量
3:使用這些kettle變量來作為參數去tb_user中查詢出來user_name,並將結果寫入kettle變量
4:使用kettle中的變量,來對tb_order進行update操作

頂層配置是一個job,里面包含一個轉換和一個job,轉換實現了第1步的功能,job包含3個轉換,分別實現了第2、3、4步的功能。具體配置如下:
頂層配置,比較關鍵的部分就是,job的屬性設置是,一定要選中"執行每一個輸入行":

轉換從tb_order獲得數據的配置。表輸入中使用的sql為:SELECT order_id,user_id FROM tb_order

 

job通過user_id得到user_name的配置如下

 

設置變量就是思路中的第2步,將內存中的一條記錄寫入kettle中的變量,注意,字段名需要和頂層的轉換中對應的查詢的名字一致,字段類型需要和實際的數據庫表的字段類型一致。設置變量的配置如下,我是通過獲取字段的方式來讓其自動設置變量的。

 

轉換根據user_id獲得user_name的配置就是思路中的第3步,如下,${USER_ID}就是上一步的轉換設置的一個變量,本步驟的設置變量,就是把查詢得到的結果,保存起來:

 

轉換修改tb_order中的user_name的配置就是思路中的第4步,是一個sql腳本。配置信息如下:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM