我有来自CSV的数据流。它是一个扁平的结构化数据库。
例如:
a,b,c,d
a,b,c,e
a,b,f
这实质上转变为:
Node id,Nodename,parent id,level
100, a , 0 , 1
200, b , 100 , 2
300, c , 200 , 3
400, d , 300 , 4
500, e , 300 , 4
600, f , 200 , 3
可以使用Pentaho完成吗?我已经完成了转型步骤。但是没有什么能让我觉得可以用于此目的。如果有任何我可能错过的步骤,请告诉我。
答案 0 :(得分:4)
您的CSV文件包含图表或树的定义。输出格式很丰富(需要生成node_id
,需要解析parent_id
,需要设置level
)。在Pentaho Data Integration中处理此类CSV文件时,您将面临几个问题:
数据加载&处理:
解决方案步骤:
rowData
rowData
拆分为nodes
并计算输出值:nodeId, nodeName, parentId, nodeLevel
[请参阅下面的代码] nodeName
对行进行排序。 [a,b,c,d,a,b,c,e,a,b,f >> a,a,a,b,b,c,c,d,e,f]
nodeName
删除重复的行。 [a,a,a,b,b,c,c,d,e,f >> a,b,c,d,e,f]
修改的Java脚本值代码:
function writeRow(nodeId, nodeName, parentId, nodeLevel){
newRow = createRowCopy(getOutputRowMeta().size());
var rowIndex = getInputRowMeta().size();
newRow[rowIndex++] = nodeId;
newRow[rowIndex++] = nodeName;
newRow[rowIndex++] = parentId;
newRow[rowIndex++] = nodeLevel;
putRow(newRow);
}
var nodeIdsMap = {
a: "100",
b: "200",
c: "300",
d: "400",
e: "500",
f: "600",
g: "700",
h: "800",
}
// rowData from record stream (CSV input step)
var nodes = rowData.split(",");
for (i = 0; i < nodes.length; i++){
var nodeId = nodeIdsMap[nodes[i]];
var parentNodeId = (i == 0) ? "0" : nodeIdsMap[nodes[i-1]];
var level = i + 1;
writeRow(nodeId, nodes[i], parentNodeId, level);
}
trans_Status = SKIP_TRANSFORMATION;
修改的Java脚本值字段设置: