dbh的建议应该确实有效,但我没有尝试过。
但是,我有另一种解决方案,它不需要改变输入格式,也不会太复杂而无法实现。实际上,这个工作只有2个转换组件(tDenormalize和tMap)。
这项工作如下:
解释:
- 您的输入是从CSV文件中读取的(可以是数据库或任何其他类型的输入)
- tDenormalize组件将根据id列(第1列)上的值对列值进行非规范化(第2列),使用特定分隔符(在我的情况下为“;”)分隔字段,结果如2行所示。
- tMap:使用java的String.split()方法将聚合列拆分为多个列,并将生成的数组分散到多个列中。 tMap应该是这样的:
由于Talend不接受存储Array对象,因此请确保以对象格式存储拆分的String。然后,将该对象转换为Map右侧的Array。
这种方法应该能给你预期的结果。
重要强>:
- tNormalize可能会对行进行随机播放,这意味着对于更大的输入,您可能会遇到未排序的输出。确保在需要时对其进行排序或使用tDenormalizeSortedRow。
- tNormalize类似于聚合组件,意味着它在处理之前扫描整个输入,这导致特别大的输入(数千万条记录)可能出现性能问题。
- 您输入的内容可能有误(您有5个条目,其中1为ID,6个条目为2,ID为id)。预计6列意味着每个ID应始终有6行。如果没有,那么你应该实现dbh的解决方案,你可能必须添加一个带有密钥的列。
您可以使用Talend的tPivotToColumnsDelimited组件来实现此目的。您很可能需要在数据中添加一列来表示字段名称。
喜欢"标识符,字段名称,值"
然后,您可以使用此组件来旋转数据并将文件写为输出。如果需要进一步处理数据,请使用tFileInoutDelimited读取生成的文件。
请参阅文档和示例
https://help.talend.com/display/TalendOpenStudioComponentsReferenceGuide521EN/13.43+tPivotToColumnsDelimited