【问题标题】:How can my custom TOS component add columns to output based on input schema/metadata?我的自定义 TOS 组件如何根据输入模式/元数据将列添加到输出?
【发布时间】:2013-04-09 16:26:41
【问题描述】:

我正在使用 Talend Open Studio 进行数据集成,我想创建一个自定义组件来输出输入数据以及一些从输入列派生的额外列。作为概念证明,在下面的代码中,我试图为每一列创建一个重复的列,但实际示例将具有更复杂的逻辑。这是我在 .javajet 文件的“开始”部分为组件尝试的内容:

<%@ jet
    imports="
        org.talend.core.model.process.INode
        org.talend.core.model.process.ElementParameterParser
        org.talend.core.model.metadata.IMetadataTable
        org.talend.core.model.metadata.IMetadataColumn
        org.talend.core.model.process.IConnection
        org.talend.core.model.process.IConnectionCategory
        org.talend.designer.codegen.config.CodeGeneratorArgument
        org.talend.core.model.metadata.types.JavaTypesManager
        org.talend.core.model.metadata.types.JavaType
        java.util.List
        java.util.Map       
    "
%>
<%
    CodeGeneratorArgument codeGenArgument = (CodeGeneratorArgument) argument;
    INode node = (INode)codeGenArgument.getArgument();
    String cid = node.getUniqueName();   

    IConnection conn = node.getOutgoingConnections().get(0);
    IMetadataTable outputMetadataTable = conn.getMetadataTable();

    List<IMetadataTable> metadatas = node.getMetadataList();
    IMetadataTable metadata = metadatas.get(0);

    List<IMetadataColumn> columnsToAdd = new java.util.ArrayList<IMetadataColumn>();
    for(IMetadataColumn col : outputMetadataTable.getListColumns()){
      IMetadataColumn cloned = col.clone();
      cloned.setLabel("Clone_of_" + cloned.getLabel());
      columnsToAdd.add(cloned);
    }

    List<IMetadataColumn> cols = new java.util.ArrayList<IMetadataColumn>(outputMetadataTable.getListColumns());
    cols.addAll(columnsToAdd);
    outputMetadataTable.setListColumns(cols);

%>

这似乎几乎可以工作,但并不完全。如果我将组件添加为具有单个输入和单个输出的流的一部分,则输出确实会显示所需的额外列。但是,生成的 Java 代码仍然存在编译错误。看起来我的组件输出的“结构”没有表示附加列的字段。也就是说,如果 row1 是输入,row2 是输出,则 row2Struct 类没有由元数据更改表示的额外字段。因此,即使 UI 会显示这些列存在于输出中,但似乎我实际上无法将任何值放入这些列中。

既然我能够更改元数据中的哪些列,那么我必须有一种方法可以让这反映在行的结构中,对吧?是否有某种“更新”方法或我缺少的东西?

【问题讨论】:

    标签: java custom-component etl talend


    【解决方案1】:

    在这种情况下,row2Struct 构造函数需要在你的 _main.javajet 生成的 java 代码中调用,如下所示:

    <%
    String outConnName = conn.getName();
    %>
    <%=outConnName %> = new <%=outConnName %>Struct();
    

    那么如果你想在你的输出数据流中复制一些输入数据,你可以生成如下java代码:

    <%
    for ( IMetadataColumn outColumn : outColumns) {
    %>
    <%=outConnName%>.<%=outColumn.getLabel()%> = <%=inConnName%>.<%=outColumn.getLabel()%>;
    <%
    }
    %>
    

    【讨论】:

    • 我可以访问row2Struct,但问题是它只有原始字段,没有我在being.javajet中添加的新字段。
    • 为了更清楚为什么这不起作用,生成的Java代码在引用row2.Clone_of_Column1等时出现编译错误。row2Struct没有克隆列的字段,我得到消息“Clone_of_Column1 无法解析或不是字段。”
    • 好的,我现在明白了。不支持在 javajet 中修改组件元数据。 javajet代码只用于java代码生成(不是组件参数控制)
    猜你喜欢
    • 2018-09-14
    • 1970-01-01
    • 2021-10-05
    • 2023-03-13
    • 2018-07-01
    • 2017-08-25
    • 2023-03-12
    • 2020-05-05
    • 1970-01-01
    相关资源
    最近更新 更多