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; 必須加上,否則預設輸出原行資料,會有重複的行。