使用tMemorizeRows組件可能會有更簡單的方法來完成此任務,但想到的第一個想法是使用globalMap來存儲滾動總和。
在Talend中,可以在globalMap中存儲一個對象(任何值或任何類型),以便稍後在作業中檢索它。如果您曾經使用tFlowToIterate組件,它允許您從全局映射中檢索正在迭代的行的值,則會自動使用它。
一個非常基本的樣本作業可能是這樣的:
在此,我們有一個tJava組件,只有初始化的辦事處一覽滾動和用下面的代碼:
//Initialise the rollingSum global variable
globalMap.put("rollingSum", 0);
在此之後,我們將這個組件連接到SubjobOk上,以確保我們只有在設法將rollingSum
放入globalMap時才能繼續。
然後我使用tFixedFlowInput組件提供我的數據,該組件允許我輕鬆地爲此示例作業硬編碼一些值。您可以輕鬆地將其替換爲任何輸入。我從這個問題用你的樣本輸入數據:
然後,我們使用tJavaRow將由行做的數據行一些轉換處理數據。我用下面的代碼適用於這個例子:
//Initialise the operator and the value variables
String operator = "";
Integer value = 0;
//Get the current rolling sum
Integer rollingSum = (Integer) globalMap.get("rollingSum");
//Extract the operator
Pattern p = Pattern.compile("^([+-])([0-9]+)$");
Matcher m = p.matcher(input_row.deltaStock);
//If we have any matches from the regular expression search then extract the operator and the value
if (m.find()) {
operator = m.group(1);
value = Integer.parseInt(m.group(2));
}
//Conditional to use the operator
if ("+".equals(operator)) {
rollingSum += value;
} else if ("-".equals(operator)) {
rollingSum -= value;
} else {
System.out.println("The operator provided wasn't a + or a -");
}
//Put the new rollingSum back into the globalMap
globalMap.put("rollingSum", rollingSum);
//Output the data
output_row.stock = rollingSum;
output_row.date = input_row.date;
有不少那兒的情況,但基本上它開始從辦事處一覽獲取當前rollingSum
。
接下來,它使用正則表達式將deltaStock
字符串拆分爲operator
和value
。由此它使用提供的運營商(加號或減號)將deltaStock
添加到rollingSum
或從rollingSum
中減去deltaStock
。
之後,它將新的rollingSum
添加回globalMap,並輸出stock
和date
(不變)的2列。
在我的示例工作中,我使用tLogRow輸出數據,它將數據的值打印到控制檯。我通常選擇表格格式選項,在這種情況下,我得到以下輸出:
.-----+----.
|tLogRow_8 |
|=----+---=|
|stock|date|
|=----+---=|
|50 |J0 |
|130 |J1 |
|100 |J2 |
'-----+----'
這應該是你在找什麼。