kettle-如何使用JavaScript步驟

描述

這是“ JavaScript值 ”步驟的修改版本,可提供更好的性能和更輕鬆的基於表達式的用戶界面,以構建JavaScript表達式。此步驟還允許您爲每個步驟創建多個腳本。

另請參閱“將JavaScript從2.5.x遷移到3.0.0 ”以獲取更多內部細節。

您本地的“ data-integration / samples / transformations”文件夾中也有很多示例。

請記住,由於該步驟正在解釋JavaScript,因此在性能上存在劣勢。如果性能對您至關重要,請參閱“腳本”部分中的其他步驟。

Java腳本功能

本節提供了可用腳本,函數,輸入字段和輸出字段的樹狀視圖。

  • 轉換腳本:顯示在此步驟中創建的腳本列表
  • 轉換常數:一組預定義的靜態常數,包括SKIP_TRANSFORMATION,ERROR_TRANSFORMATION和CONTINUE_TRANSFORMATION
  • 轉換函數:包含各種字符串,數字,日期,邏輯和專用函數,可用於創建腳本。要將功能添加到腳本中,只需雙擊該功能或將其拖動到腳本中要插入的位置。
  • 輸入字段:進入步驟的輸入列表。雙擊或使用拖放將字段插入腳本。
  • 輸出字段:步驟的輸出列表。

Java腳本

在此部分中,您可以編輯此步驟的腳本。您可以通過雙擊要插入的節點或將對象拖到Java腳本面板上,從左側的樹控件中插入函數,常量,輸入字段等。

字段

字段表包含腳本變量的列表,包括添加元數據(如描述性名稱)的功能。

附加功能

  • 獲取變量 按鈕 -從腳本中檢索變量列表。
  • 測試腳本 按鈕 -使用此按鈕可以測試腳本的語法。

Java腳本內部API對象

您可以使用以下內部API對象(供參考,請參見源代碼中的類):

  • TransformationName:具有實際轉換名稱的字符串
  • step: org.pentaho.di.trans.steps.scriptvalues_mod.ScriptValuesMod的實際步驟實例
  • rowMeta: org.pentaho.di.core.row.RowMeta的實際實例
  • row:實際數據Object []的實際實例

常見問題

兼容性開關有什麼作用?

javascript引擎有兩個版本:2.5版本和3版本。如果選中了“兼容模式”(默認情況下爲“兼容模式”),則javascript的工作方式與2.5版相同。顯然,應儘可能使用新版本,因此,如果可以的話,請取消選中“兼容模式”。

這兩個版本之間的最大區別是,在2.5中,值對象可以直接修改,並且它們的類型可以更改(日期變量可以轉換爲字符串)。這可能會導致細微的錯誤(有關更多詳細信息,請參見遷移2.5-> 3.0文檔)。由於在3.0版本中不再可能,因此javascript也應該更快。

有關更多詳細信息,請閱讀遷移2.5-> 3.0 doc。

如何檢查行中字段的存在(啓用兼容性)?

以下代碼段(使用兼容功能打開)可讓您進行檢查。但是請記住,您不能在PDI中混合行,流經單個躍點的所有行必須具有相同數量的字段,並且它們必須具有相同的名稱和類型。

片段:

var idx = row.searchValueIndex("lookup");
if ( idx < 0 )
{
   var lookupValue = 0;
}
else
{
   var lookupValue = row.getValue(idx);
}

沒有兼容性的相同代碼段已打開:

var idx = getInputRowMeta().indexOfValue("lookup");
if ( idx < 0 )
{
   var lookupValue = 0;
}
else
{
   var lookupValue = row[idx];
}

如何連續添加新字段

預先注意,將字段添加到行中的順序很重要。始終以相同的順序添加字段以保持行的結構連貫。

現在添加一個字段:

在源代碼中將其定義爲“ var”,並將其添加爲JavaScript對話框下半部分的fields表中的字段。

如何修改值(關閉兼容性)

在3.0及更高版本中,更改輸入值(以及可能更改其類型)的首選方法是創建一個新變量,並使用主要javascript文本區域下方的“字段”列表將其輸出。然後在單獨的“選擇值”步驟中,用新變量替換舊變量。儘管它比2.5中的樣式略差,但是代碼應該更快,更安全。

或者(可以在4.1.0-GA之後改進錯誤報告),可以使用“替換值’Fieldname’或’Rename To’”字段。如果是,則使用“重命名爲”字段(或者如果爲空白,則使用“字段名”字段)來查找現有字段並替換其值和元數據類型。如果輸入流中不存在指定的字段,則將錯誤傳遞到下一步,指示找不到要替換的字段。

如何修改值(啓用兼容性)

啓用兼容性後,按如下所示在輸入字段上使用setValue(假設field1是輸入行中的字段):

field1.setValue(100);

setValue()接受可以在PDI中使用的所有可能的類型(還包括String,Dates等)。

如何在JavaScript中使用類似NVL的內容?

啓用兼容性開關後,可以使用以下構造(獲得類似nvl(a,‘0’)的東西):

var a;
if ( fieldname.isNull() )
{
    a = '0';
}
else
{
    a = fieldName.getString();
}

您還可以使用:

fieldName.nvl('1');

如果fieldName爲null,則它將用’1’的值替換fieldName的值。

如何分割字段

在一個字段中,我有包含數字和字符的商家代碼,例如。“ 12345McDonalds”。我想拆分它,但是該字段沒有一致的佈局,我想拆分第二部分中的數字第一部分。

使用以下一段JavaScript,Merchant_Code是輸入字段的名稱

var str = Merchant_Code.getString();
 
var code = "";
var name = "";
 
for (i = 0; i < str.length(); i++ )
{
    c = str.charAt(i);
    if ( ! java.lang.Character.isDigit(c) )
    {
        code = str.substring(0, i);
        name = str.substring(i);
        Alert("code="+code+", name="+name);
        break;
    }
}

Alert()僅用於顯示字段。在外部for循環之後,您可以在新的單獨字段中添加代碼和名稱,例如

比較值

來自數據行的所有值都是Java對象,因此無法對帶有“ =”,“>”,“ <”等的值進行比較。

您需要使用特定於Java對象的比較方法(請參見下面的示例)。

比較字符串值

確保使用以下構造:

string.equals(otherString)

確保不要對字符串使用==運算符

如果要忽略大小寫差異,也可以使用以下方法:

string.equalsIgnoreCase(otherString)

比較數值

默認情況下,即使您認爲分配了整數,JavaScript中分配的大多數值都是浮點值。

無論是什麼情況,如果您在使用==或在已知本質上爲整數的值上切換/大小寫時遇到麻煩,請使用以下構造:

parseInt(num)==parseInt(num2)

或者

switch(parseInt(valuename))
{
case 1:
case 2:
case 3:
 strvalueswitch = "one, two, three";
 break;
case 4:
 strvalueswitch = "four";
 break;
default:
 strvalueswitch = "five";
}

篩選行

如果要過濾行,即從輸出中刪除行,則可以設置trans_Status變量:

trans_Status = CONTINUE_TRANSFORMATION
if (/* add your condition here */) trans_Status = SKIP_TRANSFORMATION

從輸出中刪除所有符合條件的行。

參考

https://wiki.pentaho.com/display/EAI/Modified+Java+Script+Value

發佈了244 篇原創文章 · 獲贊 29 · 訪問量 24萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章