etl - 在 with PowerCenter中,我如何使用单一映射来处理不同但类似格式的多个文件?

  显示原文与译文双语对照的内容

我有一些文件,我想合并到一个数据库表中。 这些文件具有相似但不同的格式。 这些文件的外观如下:

:?

  • ColA: 字符串
  • ColB: 字符串
  • ColC: 字符串

FileTwo:

  • ColAA: 字符串
  • ColBB: 字符串
  • ColCC: 字符串

FileThree:

  • Col01: 字符串
  • Col02: 字符串
  • Col03: 字符串

目标表如下所示:

TableDestination:

  • ColFirst: 字符串
  • ColSecond: 字符串
  • ColThird: 字符串

我想开发一个映射到这三个数据库中的映射,但是由于列名不同,或者三个不同的源。 问题是我的例子是虚构的: 实际上,我有很多不同的文件,它们都有不同的格式和列名,但是这些数据都非常相似。

我想开发一个单独的映射或者工作流,只需添加一个包含列映射的表。 这样的表将基于上面的示例文件和示例表:

TableMappings:

TableMappings

通过这种方式,编辑列映射我只需要对这个TableMappings表进行编辑。 我根本不需要对映射或者工作流做任何更改。 我也不必重新部署应用程序。

什么是映射或者工作流,可以利用类似这样的东西? 我假设有一个平面文件源从文件夹中获取文件。 中间会有一些东西使用这个TableMappings表来映射列名。 最后会有一个关系数据对象,代表我的目标数据库表"TableDestination"。 我不知道怎么把这个放在一起。

时间: 原作者:

Flat Files 作为源,列名不重要。 列计数是否匹配都不重要。 如果实际文件将有更多的列,那么 Source Definition 只会读取( n 是 Source Definition 中的端口数) 。 在相反的情况下,额外的端口将包含空值。

说起来,装载多个平面文件很容易。

如果列顺序不同且你希望这个额外的static 表定义列映射,那么问题就是这个问题。 可以使用 换句话说,Java Transformation 进行列映射,这是可行的。 但是整个解决方案太复杂了,我无法在这里描述。 我可以尝试answewr准确的。特定的quesitons - 但是我不能准备和粘贴完整的解决方案。

原作者:

这也可以用表达式来完成。 你需要一个"泛型" Source Definition ( 比如 。 Column1Column2ColumnN ) 以及在每个端口中,一个检查应该返回哪个端口的表达式。 E.g.

DECODE (SUBSTR(TargetColumnOrder,X,1), '1', Column1, '2', Column2,. . . 'N', ColumnN)

使用X 作为端口索引。

上面假设映射表的结构有一点不同:


FileName | TargetColumnOrder
----------------------------
FileOne | 231
FileTwo | 527

注 1: 如果可以有不同数量的列,则需要检查 Length(TargetColumnOrder) 是否小于端口索引,否则子字符串不工作。

注意 2: 上解决方案还没有被测试或者实现。 请将这里视为一般描述,而不是确切的代码基础。

原作者:
...