gpt4 book ai didi

java - 我的自定义 TOS 组件如何根据输入架构/元数据将列添加到输出?

转载 作者:行者123 更新时间:2023-12-01 06:18:53 25 4
gpt4 key购买 nike

我正在使用 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 类不具有由元数据更改表示的额外字段。因此,即使用户界面会向我显示这些列存在于输出中,但我似乎无法实际将任何值放入这些列中。

由于我能够更改元数据中的列,因此我必须有一种方法可以让它反射(reflect)在行的结构中,对吧?是否有某种“更新”方法或我缺少的东西?

最佳答案

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

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

然后,如果您想在输出数据流中复制一些输入数据,您可以生成以下 java 代码:

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

关于java - 我的自定义 TOS 组件如何根据输入架构/元数据将列添加到输出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15907392/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com