Pentaho转换树结构数据

时间:2015-03-12 09:42:20

标签: pentaho etl kettle

我有来自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完成吗?我已经完成了转型步骤。但是没有什么能让我觉得可以用于此目的。如果有任何我可能错过的步骤,请告诉我。

1 个答案:

答案 0 :(得分:4)

您的CSV文件包含图表或树的定义。输出格式很丰富(需要生成node_id,需要解析parent_id,需要设置level)。在Pentaho Data Integration中处理此类CSV文件时,您将面临几个问题:

数据加载&处理:

  • 行的长度不同(有时是4个节点,有时是3个节点)。
  • 加载整行。然后将行拆分为节点,并为每个记录流项处理一个节点。
  • 您可以在与拆分节点的步骤相同的步骤中计算输出值。

解决方案步骤:

  1. CSV文件输入:从CSV加载数据。 设置:无标题行;分隔符=&#39 ;;&#39 ;;一个名为rowData
  2. 的输出列
  3. 已修改的Java脚本值:将rowData拆分为nodes并计算输出值:nodeId, nodeName, parentId, nodeLevel [请参阅下面的代码]
  4. 对行进行排序nodeName对行进行排序。 [a,b,c,d,a,b,c,e,a,b,f >> a,a,a,b,b,c,c,d,e,f]
  5. 唯一行:按nodeName删除重复的行。 [a,a,a,b,b,c,c,d,e,f >> a,b,c,d,e,f]
  6. 文本文件输出:写出结果。
  7. 修改的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脚本值字段设置

    • 字段名;类型;替换值&#39;字段名称&#39;或者&#39;重命名为&#39;
    • 节点ID;串; Ñ
    • 节点名称;串; Ñ
    • PARENT_ID;串; Ñ
    • nodeLevel;串; Ñ