kettle常見問題(二)
作者:gemini5201314
10. 字元集
Kettle使用Java 通常使用的UTF8 來傳輸字元集,所以無論你使用何種資料庫,任何資料庫種類的字元集,kettle 都是支援的,如果你遇到了字元集問題,也許下面這些提示可以協助你:
1. 單資料庫到單資料庫是絕對不會出現亂碼問題的,不管原資料庫和目標資料庫是何種種類,何種字元集
2. 多種不同字元集的原資料庫到一個目標資料庫,你首先需要確定多種來源資料庫的字元集的最大相容字元集是什麼,如果你不清楚,最好的辦法就是使用UTF8來建立資料庫.
3. 不要以你工作的環境來判斷字元集:現在某一個測試人員手上有一個oracle 的基於xxx 字元集的已經存在的資料庫,並且非常不幸的是xxx 字元集不是utf8 類型的,於是他把另一個基於yyy字元集的oracle 資料庫要經過某一個ETL過程轉換到oracle , 後來他發現無論怎麼樣設定都會出現亂碼,這是因為你的資料庫本身的字元集不支援,無論你怎麼設定都是沒用的. 測試的資料庫不代表最後產品啟動並執行資料庫,尤其是有時候為了省事把多個不同的項目的不相關的資料庫裝在同一台機器上,測試的時候又沒有分析清楚這種環境, 所以也再次強調描述實體環境的重要性.
4. 你所看到的不一定代表實際儲存的:mysql 處理字元集的時候是要在jdbc 串連的參數裡面加上字元集參數的,而oracle 則是需要伺服器端和用戶端使用同一種字元集才能正確顯示,所以你要明確你所看到的字元集亂碼不一定代表真的就是字元集亂碼,這需要你檢查在轉換之前的字元 集是否會出現亂碼和轉換之後是否出現亂碼,你的案頭環境可能需要變動一些參數來適應這種變動
5. 不要在一個轉換中使用多個字元集做為資料來源.
11. 預定義時間維
Kettle提供了一個小工具協助我們預填充時間維,這個工具在kettle_home / samples / transformations / General – populate date dimension. 這個樣本產生的資料不一定能滿足各種需要,不過你可以通過修改這個樣本來滿足自己的需求.
12. SQL tab 和 Options tab
在你建立一個資料庫連接的時候除了可以指定你一次需要初始化的串連池參數之外(在 Pooling 選項卡下面),還包括一個Options 選項卡和一個 SQL 選項卡, Options 選項卡裡面主要設定一些串連時的參數,比如autocommit 是on 還是off , defaultFetchSize , useCursorFetch (mysql 預設支援的),oracle 還支援比如defaultExecuteBatch , oracle.jdbc.StreamBufferSize, oracle.jdbc.FreeMemoryOnEnterImplicitCache ,你可以查閱對應資料庫所支援的串連參數,另外一個小提示:在建立資料庫連接的時候,選擇你的資料庫類型,然後選到Options 選項卡,下面有一個Show help text on options usage , 點擊這個按鈕會把你帶到對應各個資料庫的串連參數的官方的一個參數列表頁面,通過查詢這個列表頁面你就可以知道那種資料庫可以使用何種參數了.
對於SQL 選項卡就是在你一串連這個Connection 之後,Kettle 會立刻執行的sql 語句,個人比較推薦的一個sql 是執行把所有日期格式統一成同一格式的sql ,比如在oracle 裡面就是:
alter session set nls_date_format = xxxxxxxxxxxxx
alter session set nls_xxxxxxxxx = xxxxxxxxxxxx
這樣可以避免你在轉換的時候大量使用to_date() , to_char 函數而僅僅只是為了統一日期格式,對於累加式更新的時候尤其適用.
13. 資料複製
有的時候可能我們需要的是類似資料複製或者一個備份資料庫,這個時候你需要的是一種資料庫私人的解決方案,Kettle 也許並不是你的第一選擇,比如對於Oracle 來說,可能rman , oracle stream , oracle replication 等等, mysql 也有mysql rmaster / slave 模式的replication 等私人的解決方案,如果你確定你的需求不是Data Integration這方面的,那麼也許kettle 並不是一個很好的首選方案,你應該諮詢一下專業的DBA人士也會會更好.
14. 如何控製版本變更
Kettle 的每一個transformation 和job 都有一個version 欄位(在你儲存的時候), 不過這個功能還不實用,如果你需要版本控制的話,還是建議你將transformation 和job 轉換成文字檔儲存,然後用svn 或cvs 或任意你熟悉的版本控制系統將其儲存,kettle 將在下一個版本加入版本控制的功能(做的更易用).
15. 支援的資料來源
Kettle 支援相當廣的資料來源,比如在資料庫裡面的一些不太常見的Access , MaxDB (SAP DB) , Hypersonic , SAP R/3 system , Borland Interbase , Oracle RDB , Teradata和3.0新加入的Sybase IQ .
另外還包括Excel , CSV , LDAP ,以及OLAP Server Mondrian , 目前支援Web Service 不過暫時還不支援SOAP.
16. 調試和測試
當ETL轉換出現不可預知的問題時,或是你不清楚某個步驟的功能是什麼的情況下,你可能需要建立一個類比環境來調適程式,下面一些建議可能會有所協助:
盡量使用generate row 步驟或者固定的一個文字檔來建立一個類比的資料來源
類比的資料來源一定要有代表性,資料集一定盡量小(為了效能考慮)但是資料本身要足夠分散.
建立了類比的資料集後你應該清楚的知道你所要轉換之後的資料時什麼樣的.
17. 錯誤處理
在ETL任務中由於資料問題出現轉換錯誤是一件非常正常的事情,你不應該設計一個依賴於暫存資料表或者擁有事務特點的ETL過 程,面對資料來源品質問題的巨大挑戰,錯誤處理是並不可少的,kettle同樣提供非常方便的錯誤處理方式,在你可能會出錯的步驟點擊右鍵選擇Define Error handing , 它會要求你指定一個處理error 的步驟,你可以使用文字檔或者資料庫的表來儲存這些錯誤資訊,這些錯誤資訊會包含一個id 和一個出錯的欄位,當你得到這些錯誤資訊之後就需要你自己分析出錯的原因了,比如違反主鍵約束可能是你產生主鍵的方式有錯誤或者本身的資料有重複,而違反 外鍵約束則可能是你依賴的一些表裡面的資料還沒有轉換或者外鍵表本身過濾掉了這些資料. 當你調整了這些錯誤之後,確定所有依賴的資料都被正確的處理了.kettle user guide 裡面有更詳細的解釋,裡面還附帶了一個使用javascript 來處理錯誤的樣本,這種方式可以作為處理簡單資料品質的方式.
18. 文檔,文檔,文檔
Kettle 提供了豐富的文檔和使用手冊,小到一個資料庫連接怎麼連,大到一個功能怎麼實現,所有的參數列表,對話方塊的每一個輸入輸出代表什麼意思都有解釋,所以當你 遇到問題你應該第一時間翻閱這些文檔,也許上面已經告訴你怎麼做了. 另外kettle 還有一個非常活躍的社區,你可以到上面提問,但是記住在你提問之前先搜尋一下論壇看有沒有類似的問題已經問過了,如果沒有記得描述清楚你的問題
總結
本系列文章主要討論了如何使用kettle 來處理資料倉儲中的緩慢增長維,動態ETL如何設計,累加式更新的一些設計技巧,在應用程式中如何整合kettle 以及在使用kettle 時的一些常見問題. 如果你正在尋找一個工具來協助你解決資料庫的整合問題或是你打算建立一個商業智慧項目的資料倉儲,那麼kettle是一個不錯的選擇,你不用支付任何費用 就可以得到很多很多Data Integration的特性,大量文檔和社區支援. 難道這些不就是你希望從一個商業工具上的到的嗎?還在等什麼 ,開始你的Data Integration之旅吧