Talend中變數載入(tContextLoad)的用法,及其他注意事項

來源:互聯網
上載者:User

此文為本人私下參考用,不拘泥於表達

一、要用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="無名氏"; }

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.