在 Talend Open Studio for Data Integration 中一次处理一组行
Processing a single group of rows at once in Talend Open Studio for Data Integration
我有一个数据源,其中每行有五个字段:
company name; year; code; value;
在我的目标输出行模型中,我想生成这样的行
company name;year;value1;value2;value3;value4
其中 value1、value..N 不是单个代码的串联,而是 "mapping"。 IE。代码 50 => "Total Revenues"
所以我需要执行以下逻辑:
- 第一select同一公司名称/年份的所有记录
- 然后应用一些自定义 java 逻辑来执行我的代码和输出行的字段之间的映射。
这是一个约 100 万行的内存映射缩减。这应该如何在 Talend Open Studio for Data Integration 中处理?
请参阅下面的解决方案,我相信该解决方案将满足您获取带分隔符的文件数据源并将其转换为上述指定的非规范化输出的精确要求。
首先,我模拟了一个与您指定的格式相同的文件。我将这些值作为公司、年份和顺序的逻辑串联。这使得验证输出变得容易。
接下来我将它用作输入,运行 它通过排序器,然后对值字段进行非规范化。最后你可以在 tLogRow
中看到输出。
我还包含了 tDenormalize
的组件视图,因此您可以看到它是如何完成的。您可以在 Talend Open Studio
.
的任何方面使用此技术
select all the records for the same company name / year
您可能希望使用 tAggregate
(https://help.talend.com/display/TalendOpenStudioComponentsReferenceGuide521EN/18.1+tAggregateRow) 按公司名称和年份对流程进行分组
apply some custom java logic that performs the mapping between my codes and my fields of the output row.
Talend 有一个名为 tMap
的组件,允许您将输入字段映射到输出字段。
在您的 tMap
中,您可以使用类似的东西:
(假设 input
是流入 tMap
的名称,output
是流出 tMap
的名称)
在output.field1
中放input.code == 50? input.value : 0
在output.field2
中放入input.code == 60? input.value : 0
在output.field2
中放input.code == 70? input.value : 0
等等
这是假设如果 value
用于另一个 code
.
,您可以将 field
列保留为 0
如果您希望每个 code
的 value
位于 tMap
之外的不同输出行中,您可以使用与上述类似的逻辑,只将每个测试(code == 70? input.value : 0
) 在不同的输出 table,然后在 tMap
.[=41 之后过滤掉具有 0
(使用 tFilter
)的行=]
要添加输出 table,您可以使用 tMap
右上角的 +
符号。
有关如何使用 tMap
的更多详细信息,请参阅此处:https://help.talend.com/display/TalendOpenStudioComponentsReferenceGuide54EN/tMap
希望对您有所帮助!
您可以那样做,这实际上是 Maira Bay 已经建议的方法:
- 将您的数据源设置为一次发出这些行。为此,我使用了
tFixedFlowInput
。您可能必须从文件中读取。
- 可选择按公司名称和年份排序
tSortRow
。
- 使用
tMap
将每一行的值映射到结果行中的相应列,并使用类似 input.code.equals("code for this column") ? input.value : null
. 的保护子句
- 使用
tAggregateRow
聚合行,按公司名称和年份分组,为每个值行选择第一个值 - 但确保忽略空值。
- 对结果行做任何你想做的事。
我尝试使用一些示例数据,因此在第 1 步中使用了 tFixedFlowInput
,它在我的 TOS 6.3.1 机器上对我有效。
注意:所提出的解决方案假定您对每个公司名称、年份和代码的组合只有一个值。
我有一个数据源,其中每行有五个字段:
company name; year; code; value;
在我的目标输出行模型中,我想生成这样的行
company name;year;value1;value2;value3;value4
其中 value1、value..N 不是单个代码的串联,而是 "mapping"。 IE。代码 50 => "Total Revenues"
所以我需要执行以下逻辑:
- 第一select同一公司名称/年份的所有记录
- 然后应用一些自定义 java 逻辑来执行我的代码和输出行的字段之间的映射。
这是一个约 100 万行的内存映射缩减。这应该如何在 Talend Open Studio for Data Integration 中处理?
请参阅下面的解决方案,我相信该解决方案将满足您获取带分隔符的文件数据源并将其转换为上述指定的非规范化输出的精确要求。
首先,我模拟了一个与您指定的格式相同的文件。我将这些值作为公司、年份和顺序的逻辑串联。这使得验证输出变得容易。
接下来我将它用作输入,运行 它通过排序器,然后对值字段进行非规范化。最后你可以在 tLogRow
中看到输出。
我还包含了 tDenormalize
的组件视图,因此您可以看到它是如何完成的。您可以在 Talend Open Studio
.
的任何方面使用此技术
select all the records for the same company name / year
您可能希望使用 tAggregate
(https://help.talend.com/display/TalendOpenStudioComponentsReferenceGuide521EN/18.1+tAggregateRow) 按公司名称和年份对流程进行分组
apply some custom java logic that performs the mapping between my codes and my fields of the output row.
Talend 有一个名为 tMap
的组件,允许您将输入字段映射到输出字段。
在您的 tMap
中,您可以使用类似的东西:
(假设 input
是流入 tMap
的名称,output
是流出 tMap
的名称)
在output.field1
中放input.code == 50? input.value : 0
在output.field2
中放入input.code == 60? input.value : 0
在output.field2
中放input.code == 70? input.value : 0
等等
这是假设如果 value
用于另一个 code
.
field
列保留为 0
如果您希望每个 code
的 value
位于 tMap
之外的不同输出行中,您可以使用与上述类似的逻辑,只将每个测试(code == 70? input.value : 0
) 在不同的输出 table,然后在 tMap
.[=41 之后过滤掉具有 0
(使用 tFilter
)的行=]
要添加输出 table,您可以使用 tMap
右上角的 +
符号。
有关如何使用 tMap
的更多详细信息,请参阅此处:https://help.talend.com/display/TalendOpenStudioComponentsReferenceGuide54EN/tMap
希望对您有所帮助!
您可以那样做,这实际上是 Maira Bay 已经建议的方法:
- 将您的数据源设置为一次发出这些行。为此,我使用了
tFixedFlowInput
。您可能必须从文件中读取。 - 可选择按公司名称和年份排序
tSortRow
。 - 使用
tMap
将每一行的值映射到结果行中的相应列,并使用类似input.code.equals("code for this column") ? input.value : null
. 的保护子句
- 使用
tAggregateRow
聚合行,按公司名称和年份分组,为每个值行选择第一个值 - 但确保忽略空值。 - 对结果行做任何你想做的事。
我尝试使用一些示例数据,因此在第 1 步中使用了 tFixedFlowInput
,它在我的 TOS 6.3.1 机器上对我有效。
注意:所提出的解决方案假定您对每个公司名称、年份和代码的组合只有一个值。