在Talend Open Studio for Data Integration中一次处理一组行

时间:2017-04-01 07:46:21

标签: java mapreduce talend

我有一个数据源,每行有五个字段:

company name; year; code; value;

在我的目标输出行模型中,我想生成一个像这样的行

company name;year;value1;value2;value3;value4

其中value1,value..N不是单个代码的串联,而是"映射"。即代码50 => "总收入"

所以我需要执行以下逻辑:

  1. 首先选择同一公司名称/年的所有记录
  2. 然后应用一些自定义java逻辑,执行我的代码和输出行的字段之间的映射。
  3. 这是内存映射减少约1M行。如何在Talend Open Studio for Data Integration中处理这个问题?

3 个答案:

答案 0 :(得分:2)

  

选择同一公司名称/年的所有记录

您可能希望使用tAggregatehttps://help.talend.com/display/TalendOpenStudioComponentsReferenceGuide521EN/18.1+tAggregateRow)按公司名称和年份对流进行分组

  

应用一些自定义java逻辑,执行我的代码和输出行的字段之间的映射。

Talend有一个名为tMap的组件,允许您将输入字段映射到输出字段。

tMap中,您可以使用以下内容:

(假设input是您tMap流量的名称,而output是您的tMap流量的名称

output.field1input.code == 50? input.value : 0

output.field2input.code == 60? input.value : 0

output.field2input.code == 70? input.value : 0

如果field用于另一个0,则假设您可以将value列与code一起保留。

如果您希望每个value的{​​{1}}位于code之外的不同输出行中,您可以使用与上述类似的逻辑,只需进行每项测试({ {1}})在另一个输出表中,然后在tMap之后过滤掉code == 70? input.value : 0(使用0)的行。

要添加输出表格,您可以使用tFilter右上角的tMap符号。

有关如何使用+https://help.talend.com/display/TalendOpenStudioComponentsReferenceGuide54EN/tMap

的更多详情,请参阅此处

我希望这有帮助!

答案 1 :(得分:2)

你可以这样做,而且它基本上是Maira Bay已经建议的方法:

  1. 设置数据源以一次发出一行。我使用了tFixedFlowInput。您可能必须从文件中读取。
  2. 可选择按公司名称和年份tSortRow进行排序。
  3. 使用tMap等保护条款将每行的值input.code.equals("code for this column") ? input.value : null映射到结果行中的相应列。
  4. 使用tAggregateRow聚合行,按公司名称和年份进行分组,为每个值行选择第一个值 - 但请务必忽略空值。
  5. 使用生成的行执行任何操作。
  6. 我尝试使用一些示例数据,因此在步骤1中使用了tFixedFlowInput,并且它在我的机器上在TOS 6.3.1中为我工作。

    注意:建议的解决方案假设每个公司名称,年份和代码组合只有一个值。

答案 2 :(得分:0)

请参阅下面的解决方案,我相信这将满足您对采用分隔文件数据源并将其转换为如上所述的非规范化输出的精确要求。

首先,我使用与您指定的格式相同的方式模拟了一个文件。我使这些值成为公司,年份和序列的逻辑连接。这样可以轻松验证输出。

enter image description here

接下来我使用它作为输入,通过分拣机运行它,然后在值字段上反规范化。最后,您可以在tLogRow中看到输出。

enter image description here

我还添加了tDenormalize的组件视图,以便您了解如何完成此操作。你可以在Talend Open Studio的任何一个方面使用这种技术 enter image description here