使用Talend转置数据

使用Talend转置数据,talend,Talend,我有这样的数据: 我需要使用Talend将这些数据转换成如下内容: 非常感谢您的帮助。您可以使用Talend的tPivotToColumnsDelimited组件来实现这一点。您很可能需要在数据中添加一列来表示字段名 比如“标识符、字段名、值” 然后,您可以使用该组件来透视数据并将文件作为输出写入。如果需要进一步处理数据,请使用tFileInoutDelimited读取结果文件 请参阅文档和上的示例 dbh的建议确实有效,但我没有尝试 然而,我有另一个解决方案,它不需要更改输入格式,而且实现

我有这样的数据:

我需要使用Talend将这些数据转换成如下内容:


非常感谢您的帮助。

您可以使用Talend的tPivotToColumnsDelimited组件来实现这一点。您很可能需要在数据中添加一列来表示字段名

比如“标识符、字段名、值”

然后,您可以使用该组件来透视数据并将文件作为输出写入。如果需要进一步处理数据,请使用tFileInoutDelimited读取结果文件

请参阅文档和上的示例

dbh的建议确实有效,但我没有尝试

然而,我有另一个解决方案,它不需要更改输入格式,而且实现起来也不太复杂。实际上,该作业只有两个转换组件(tDenormalize和tMap)

该作业如下所示:

说明

  • 您的输入是从CSV文件读取的(可以是数据库或任何其他类型的输入)
  • tDenormalize组件将根据id列(第1列)上的值对列值(第2列)进行反规范化,并使用特定的分隔符(“;”)分隔字段,结果显示在2行中
  • tMap:使用java的String.split()方法将聚合列拆分为多列,并将结果数组分散到多列中。tMap应该是这样的:
由于Talend不接受存储数组对象,请确保以对象格式存储拆分的字符串。然后,将该对象投射到地图右侧的数组中

这种方法应该会给你预期的结果

重要

  • tNormalize可能会将行洗牌,这意味着对于较大的输入,可能会遇到未排序的输出。如果需要,请确保对其进行排序,或者改用TDenormalizeSortDrow
  • tNormalize类似于聚合组件,这意味着它在处理之前扫描整个输入,这会导致特别大的输入(数千万条记录)可能出现性能问题
  • 您的输入可能有误(您有5个条目的id为1,6个条目的id为2)。需要6列,这意味着每个id应该始终有6行。如果没有,则应该实现dbh的解决方案,并且可能需要添加一个带有键的列

Hi@ydaetskcoR,有什么建议吗?但如果我们不知道拆分列的数量,我们该怎么办?