ETL的使用過程中遇到的坑(ETL中文亂碼、插入更新組件使用注意事項)

一、ETL中的中文亂碼問題:

1. 解決方法打開數據庫連接

 

在選項的命令參數添加第三行參數配置:characterEncoding 值爲utf-8

注意:ETL中出現的任何中文,包括流中表頭即列名是中文在保存到資源庫中都會亂碼,暫時沒有找到好的解決方案,只能在ETL程序中不用中文。

另外,最近還遇到一個問題,實施在醫院導數據,軍隊醫院his用的是 oracle數據庫 US7ASCII 格式的編碼。我們的數據庫是 mysql utf-8 的編碼,查詢了一下。發現 ASCII碼是標準的ISO-8859-1的子集,然後找有經驗的老司機給了一個示例:

r[i]=new java.lang.String(r[i].toString().getBytes("GBK"),"iso-8859-1"); 

發現不行。然後,查看了一下java中的String方法

public String(byte bytes[], String charsetName)
            throws UnsupportedEncodingException {
        this(bytes, 0, bytes.length, charsetName);
    }

然後就發現其實寫反了。最後

寫成如下形式,得到了正解。亂碼消除了。其實沒有轉成utf,最後轉成gbk就可以了。

r[i]=new java.lang.String(r[i].toString().getBytes("iso-8859-1"),"GBK"); 

還是要看原理呀

2. ETL的插入更新組件使用注意事項

插入更新組件的邏輯是如果滿足上面表格的條件則進行更新,不滿足就進行插入操作,下面的寫法是錯誤的,我們應該要去掉STATISTICS_ITEM_VALUE<>STATISTICS_ITEM_VALUE這個判斷條件,不然值如果沒有改變會進行插入操作

 

3. TINYINT類型數據,IS_ENABLE,在SQL語句中可以用IS_ENABLE=1正確判斷,但是查詢出來的1變成了Y,0變成了N,目前沒有好的解決辦法,只能在查詢出來以後使用的時候注意判斷。

4. 使用sort組件的時候需要注意死鎖問題,kettle默認是每次處理1000條記錄,sort組件要等全部數據全部進來以後纔會往下執行,而如果有其它的組件與sort組件並列,其它的組件先執行完了數據,還要等sort組件處理完數據合併的情況就會造成死鎖。例如總共有5000條記錄,第1000條記錄成功到達sort組件和並列組件中,因爲並列組件還要等待sort組件處理後的數據進行合併已經存儲了1000條記錄,下一個1000條記錄能夠成功到達sort組件,但是卻不能夠再到達並列組件中,所以造成了死鎖。參考: http://wiki.pentaho.com/display/EAI/Transformation+Deadlocks

5. 如果在作業中有循環操作的話,在循環內部的轉換中不能使用 java控件 。使用java控件的時候,可以執行循環的第一次,第二次執行循環的時候,就會報出初始化java失敗的錯誤信息,如下:

- Java 代碼.0 - ERROR (version 6.1.0.1-196, build 1 from 2016-04-07 12.08.49 by buildguy) : Error initializing UserDefinedJavaClass:
2017/04/21 16:36:14 - Java 代碼.0 - ERROR (version 6.1.0.1-196, build 1 from 2016-04-07 12.08.49 by buildguy) : org.pentaho.di.core.exception.KettleException: 
2017/04/21 16:36:14 - Java 代碼.0 - null
2017/04/21 16:36:14 - Java 代碼.0 - ERROR (version 6.1.0.1-196, build 1 from 2016-04-07 12.08.49 by buildguy) : 錯誤初始化步驟[Java 代碼]
2017/04/21 16:36:14 - ktr_set_search_candition - ERROR (version 6.1.0.1-196, build 1 from 2016-04-07 12.08.49 by buildguy) : 步驟 [Java 代碼.0] 初始化失敗!
2017/04/21 16:36:14 - ktr_set_search_candition - ERROR (version 6.1.0.1-196, build 1 from 2016-04-07 12.08.49 by buildguy) : Unable to prepare for execution of the transformation
2017/04/21 16:36:14 - ktr_set_search_candition - ERROR (version 6.1.0.1-196, build 1 from 2016-04-07 12.08.49 by buildguy) : org.pentaho.di.core.exception.KettleException: 
2017/04/21 16:36:14 - ktr_set_search_candition - 無法初始化至少一個步驟. 執行無法開始!

6. 在js控件中不能使用 JSON 對象來處理字符串轉json的操作,如下語句。

JSONArray obj = new JSONArray().fromObject(string);

這種方式在通過使用Kettle編輯etl以及執行的時候是沒有問題的。但是通過程序調用的時候,是不行的。程序報錯信息是不認識 JSON 這種情況下找到一種解決方案:使用 eval("("+ETL_VARIABLES+")") 可以實現字符串轉成json格式的操作。使用這種方式的話,就必須在java中保證入參的字符串必須是json格式的。否則經過轉換之後就會存在問題。參考:http://www.cnblogs.com/Liujunyan/p/4965924.html

7. 在執行ETL的時候,會有傳參,但是可以在 Kettle.properties 中設置參數,也可以在環境變量中設置參數,同時還可以在程序調用的時候參入參數,這些優先級如下:Kettle.properties > 環境變量參數 > 程序入參。所以在程序調用執行的時候,要避免其它兩種方式對入參的干擾。

8. 設置全局變量的問題:在某些轉換中需要生成一些全局的變量的時候,一定要在"設置環境變量"這個控件中,把前面操作產生的變量提成全局的。尤其在執行循環的時候,要把是否替換值設置對。否則循環變量就增加不上去。

9. 緩存的問題。

    etl通過Kettle執行之後,會有緩存。需要把緩存清掉,再使用程序調用。在Kettle.properties裏面設置的參數,在程序調用的時候是會發生影響的。

10. 在一個轉換中,如果有多條之路,但是某一條之路執行發生錯誤的話,是會影響其它分支的執行的。

 

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章