我正在使用 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 会显示这些列存在于输出中,但似乎我实际上无法将任何值放入这些列中。
由于我能够更改元数据中的列,因此必须有一种方法可以让我将其反映在行的结构中,对吗?是否有某种“更新”方法或我缺少的东西?