1. 程式人生 > >kettle案例五使用js指令碼進行json資料處理新增行

kettle案例五使用js指令碼進行json資料處理新增行

我們通過兩個例子來學習Js處理資料新增行:

例子一字串拆分

按照原始資料列”aaa bbb ccc ddd”把資料分成4行。
比如我們有原始資料行如下:
id group person
1 A aaa bbb ccc ddd
我們需要獲取A組中都有哪些人,則需要對資料進行拆分並生成新的行。
使用程式碼如下:

var str = person.toString();
var tokens = str.split(" ");
var i;
for (i =0; i<tokens.length; i++)
{
  var row = createRowCopy(getOutputRowMeta().size());
  var
 index = getInputRowMeta().size(); row[index]=tokens[i]; putRow(row); } trans_Status = SKIP_TRANSFORMATION;

程式碼說明


person.toString(); 資料行裡person列的資料是以空格分隔的一個字串。如"aaa bbb ccc ddd"

str.split(" "); 把字串按照空格分為一個字元陣列,如上面的例子,就分隔為長度為 4 的陣列。
for (i =0; i<tokens.length; i++)  迴圈tokens

{

createRowCopy(getOutputRowMeta().size
()); 使用 createRowCopy 函式建立一個新行,長度是getOutputRowMeta().size()。 index = getInputRowMeta().size(); 根據輸入流獲得資料行裡最後一列的位置。 row[index]=tokens[i]; 把每個 token, 放到每個新建立行的最後一列。 //這裡需要特別注意,為什麼要獲取原資料的長度作為新內容的起始索引呢? //因為新建的行還是會攜帶有輸入的列的,所以如果使用0開頭賦值,則會覆蓋掉原列,並且欄位名不對應。 putRow(row); 把新建立的行放到輸出流中,下一個步驟就可以使用了。 } trans_Status = SKIP_TRANSFORMATION; 保證原始的資料行"aaa bbb ccc ddd"
,不會被放入輸出流中。 如果不帶這一句,則原行還是會輸出一行造成重複資料。

通過這個指令碼一行資料可以變成四行資料。

例子二Json拆分

按照原始資料列
“[ { “_id” : “360cc8fc4c254b5f950ed663d4a11c0d” , “option” : “是” , “count” : 16.0 , “ratio” : 0.0} , { “_id” : “6fff270a84fd4b3e843e99ca4fd645af” , “option” : “否” , “count” : 10 , “ratio” : 0.0}]”
把資料分成2行。
比如我們有原始資料行如下:
question _id options
你日常是否更喜歡喝紅酒? 1 [ { “_id” : “360cc8fc4c254b5f950ed663d4a11c0d” , “option” : “是” , “count” : 16.0 , “ratio” : 0.0} , { “_id” : “6fff270a84fd4b3e843e99ca4fd645af” , “option” : “否” , “count” : 10 , “ratio” : 0.0}]

我們需要獲取每個問題中有哪些選項,對Json進行拆分並且新增行。

建立步驟如下:

讀取mongodb資料庫獲取這三個欄位作為js程式碼步驟的輸入:
則新建我們需要的5個新欄位questionId,question,id,option,index如下:

完整程式碼如下:

   //Alert(options);

if(options){

var optionsJson=JSON.parse(options)

  // Alert(optionsJson.length);

if(optionsJson&&optionsJson.length>0){
for(var i=0; i<optionsJson.length; i++)  
  {  


   //Alert(" 長度:"+optionsJson.length+" 當前索引:"+i);


     var id =optionsJson[i]._id;



     var option =optionsJson[i].option;



    var row = createRowCopy(7);



    row[3]=_id;



    row[4]=question;



    row[5]=id;



    row[6]=option;

    row[7]=i;

   //Alert(_id+" 問題:"+question+" 選項id:"+id+" 選項:"+option);

    //Alert(question);

  //Alert(id);

  //Alert(option);
    putRow(row);


 }
}
}

trans_Status = SKIP_TRANSFORMATION; 

需要注意的是:
因為輸入有三個欄位
question,_id,options,分別佔據了新行的陣列索引0,1,2,所以新欄位的列索引從3開始。

trans_Status = SKIP_TRANSFORMATION; 必須加上,否則預設輸出原行資料,會有重複的行。