此文為本人私下參考用,不拘泥於表達
一、要用tContextLoad,就要:
舉一個例子:
添加組件1、tFileInputDelimited。這個組件可以提取一個txt檔案,行之間預設斷行符號,您可以建一個a.txt,內容如下:
myname;along<br />sex;man
並且在下面的Schema中添加key和value兩個欄位。
2、添加組件 tContextLoad,把前者控制項和此控制項串連起來。這時一定要在運行前添加context變數,且2個變數名一定是:context.myname和context.sex才行。這時如果您選擇上“列印操作”,就是發現相關資訊了。
以上是對文字檔的context的使用說明,下面是從資料庫中提取到context變數的方法:
1、放一個tOracleInput,其中此表要有2個欄位,第一欄位是key(即描述),第二個欄位是value。注意,之前要在Contexts欄目添加tOracleInput中key裡的變數。
如果如果表有多行也無妨,就像上面的那個文字檔一樣,第一欄位是key,第二個欄位是value,當然您也可以把key和value的順序顛倒。
2、放一個tContextLoad。
後來如下:
所以,talend的常用操作流程為:
tFileInputDelimited讀出txt的內容 ---> tContextLoad寫入全域變數(當然也可用自訂的靜態變數代替全域變數)
---> 正常操作並以context變數為參考值 ---> 從資料庫中提取需要寫的文字檔的相關key和value
---> 用tFileOutputDelimited 寫入到txt檔案。這個text檔案最終都是形如上面的txt列子。
二、日期的問題
由於Talend是由JAVA做的,日期被轉為String後,就形如: 200-3-12 11:11:11.0 了。
所以下一步如果自訂select的where的話,就要用substring截取,如:
"select * from table1 where riqi > to_date('" + context.mykey.substring(0,context.mykey.length()-2) + "','yyyy-MM-DD HH24:MI:SS')"
三、自訂schema內容
軟體在用到關鍵的控制項:tMap時,一般會抽取tOracleInput 中schema的全部欄位,如果你想自訂欄位,如:select max(shijian) from a ,那麼你就需要點擊一下: Guess Schema按鈕;如果恰巧是時間類型,還需要選擇date類型。
如果對tOracleOut不是插入,而是更新的話,就要在tMap中將更新表設定一個 鍵 。如果這個表只有一個列的話,還有設定另外一個列,作為常數,作為鍵。
四、交換戳 問題
一些人用本機伺服器的時間戳記來作為資料交換的戳,方法為記錄上次交換的時間和本次交換的時間,然後下次交換時,條件會:大於本次記錄的時間。問題在這裡:你的伺服器時間不可能和資料庫伺服器時間一秒不差。比如您伺服器現在的時間是:9:00:00,資料庫伺服器時間是:8:59:58,按照上面的方法,你會記錄這次最後的交換時間為9點整,但下次您在交換時,會遺漏資料庫上的8:59:59秒。
所以,好的交換方法應為每次交換後,記錄資料轉入伺服器上記錄的max(時間),才對。下次大於這個時間。(其實,這個方法也有瑕疵,因為可能存在交換時最後一秒有多條記錄,而您可能當時只轉入了一條記錄,所以會遺漏同一秒中的其他資料。當然,這種可能性比較小,但理論上存在,解決方案是:下次取的時候,不應大於,而是大於等於這次時間。但會帶來一些效率問題,因為update的效率較低,而且因為是update,所以需要設定“鍵”)
這裡我還有個問題需要考證,就是在取轉入資料庫上的最大時間戳記時,不知是加上時間限制之後取max(時間),效率高,還是直接max(時間)效率高。
當然,我主張您還是以數字型主鍵作為 交換戳,這樣就不會重複了。
五、本地文字檔問題
以下本節的內容,隨著我對talend 的認識,發現用XML並不怎麼好,感覺還不如用txt來的方便和直接。
我主張用XML來代替txt,talend也專門有一章來介紹如何操作XML。
XPath 建議列出了一些軸,這些軸包含了一些與當前選擇節點(也稱為上下文節點)相關的節點。為避免冗長,指定了某些常用軸的一些縮寫。下表顯示這些縮寫和它們等效的軸。
| 縮寫 |
軸 |
| . |
self::node() |
| .. |
parent::node() |
| // |
/descendent-or-self::node()/ |
| @ |
attribute:: |
另一個事實是在每個位置步驟或路徑運算式上使用的預設軸是 child:: 軸。因此,/bk:books/bk:book 實際等效於 /child::bk:book/child::bk:book, 這比直接鍵入要容易得多。
舉個例子,我寫了一個XML:
<?xml version="1.0" encoding="UTF-8" ?><br /><HELLO si="xx"><br /><ren sex="男">along</ren><br /><ren sex="女">yanzi</ren><br /></HELLO>
在talend的 迴圈XPath查詢(Loop XPath Query)中就要寫: /HELLO/ren 。
在 映射(Mapping Column/XPath query)中的XPath query中填寫: '.' 就行了。更多如下:
然後是相對路徑問題:比如在檔案路徑中直接寫:"abc.xml",那在測試時,實際是在talend的安裝目錄下,而不是在具體項目下;之後匯出作業腳步後,這個abc.xml並不會被匯出,您需要在批處理的同檔案夾下複製這個abc.xml。
六、三元運算式:
talend的MAP最終以java的形式存放,所以如果想在運算式中寫java判斷代碼,我目前的方法是寫三元運算式:
1、row1.abc > context.xy ? row1.abc : context.xy
七、流水號補齊:
String.format("%05d",++row2.id)
這樣會把從表2傳過來的id首先加1,然後如果不夠5位的話,在前面補齊0。
以上的六、七,結合起來,如果想往另外一個表記錄最大值,就可想而知了。
八、自訂函數
雖然我試圖用匿名函數來給變數定義運算式(形如:String myfunction(){if.....;} ),但總是不成功,估計是不支援吧。
在talend工具左邊,有一個“代碼”,右鍵下面的“常規”,選擇“建立事務”,就可以自訂函數了。
需要注意的是,上面的藍色的注釋也是必須的,特別是一個叫:cagtegory 的,它決定了您的函數是否能出現在使用者自訂的函數工具列中。
另外,如果您寫:public static String xiao="hello"; 那麼以後您就可以在任意位置寫: along.xiao (along是您當時建立函數時寫的 class 的名字),來代替context上下文變數了。
九、錯誤處理
如果在倒庫過程中出現錯誤,就需要記錄錯誤記錄檔並警示。talend中有“logs&Errors”組件組,個人認為,對於我來講,目前其中的tDie和tWarn沒什麼用,重要的是tLogCatcher和tAssertCatcher。他們之間沒什麼大區別,都有捕獲java異常的作用,但前者的捕獲的項目更多一點。其中看tLogCatcher的schema,需要知道:
moment:代表出現錯誤的時間
project:項目名稱 job:項目中的具體作業。
type:錯誤類型,如果您只選擇了JAVA錯誤,這個就一定是JAVA異常了。
origin:哪個組件出現了錯誤。如:tOracleInput_1。雖然你的項目中未必有這個名稱(你改名了),但這是指talend系統內部記錄的這個組件是第幾次出現的那個組件,對於我怎麼才能知道呢?只需點擊某個組件,然後查看“Code”就知道了,這對於判斷在哪裡出現了錯誤,比較重要。
message:這個最重要,指錯誤內容
code:錯誤碼
最後,把以上錯誤內容寫到另外一個資料庫中,便於記錄和警示。
十、其他小注意事項
1、java中的等於一般不是 == ,而是 字元.equals("dfdf")
2、對於可能會是null的方法傳遞參數,這樣寫:
public static aa(String b){<br />if(b==null){ b="無名氏"; }